如何在Java中模拟C#操作员
时间:2020-03-06 14:52:32 来源:igfitidea点击:
在某些情况下,使用类型转换返回null值而不是抛出ClassCastException是很实际的。追踪" as"运算符来执行此操作。 Java中是否有可用的等效项,因此我们不必显式检查ClassCastException?
解决方案
我们可以使用instanceof关键字代替C#的is,但是没有像as那样的东西。
例子:
if(myThing instanceof Foo) { Foo myFoo = (Foo)myThing; //Never throws ClassCastException ... }
我认为我们必须自己动手:
return (x instanceof Foo) ? (Foo) x : null;
编辑:如果我们不希望客户端代码处理空值,那么我们可以引入一个空对象
interface Foo { public void doBar(); } class NullFoo implements Foo { public void doBar() {} // do nothing } class FooUtils { public static Foo asFoo(Object o) { return (o instanceof Foo) ? (Foo) o : new NullFoo(); } } class Client { public void process() { Object o = ...; Foo foo = FooUtils.asFoo(o); foo.doBar(); // don't need to check for null in client } }
我推测我们可能会折衷为as运算符
就像是
as<T,Type> (left, right) which evaluates to if (typeof(left) == right) return (right)left else return null
我不确定你会怎么做,那一刻我只是一只猫,自从我离开大学以来,我的Java帽子已经有点尘土飞扬了。
我们可以编写这样的静态实用程序方法。我认为它不是很可读,但这是我们尝试做的事情的最佳近似。而且,如果我们使用静态导入,那么在可读性方面也不错。
package com.stackoverflow.examples; public class Utils { @SuppressWarnings("unchecked") public static <T> T safeCast(Object obj, Class<T> type) { if (type.isInstance(obj)) { return (T) obj; } return null; } }
这是一个测试用例,演示了它是如何工作的(以及它的工作原理。)
package com.stackoverflow.examples; import static com.stackoverflow.examples.Utils.safeCast; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertNull; import org.junit.Test; public class UtilsTest { @Test public void happyPath() { Object x = "abc"; String y = safeCast(x, String.class); assertNotNull(y); } @Test public void castToSubclassShouldFail() { Object x = new Object(); String y = safeCast(x, String.class); assertNull(y); } @Test public void castToUnrelatedTypeShouldFail() { Object x = "abc"; Integer y = safeCast(x, Integer.class); assertNull(y); } }
这是@Omar Kooheji建议的as的实现:
public static <T> T as(Class<T> clazz, Object o){ if(clazz.isInstance(o)){ return clazz.cast(o); } return null; } as(A.class, new Object()) --> null as(B.class, new B()) --> B