如何在Java中模拟C#as-operator

在某些情况下,types转换返回一个空值而不是引发ClassCastException是可行的。 C#有as操作符来执行此操作。 在Java中是否有可用的等价物,所以您不必显式检查ClassCastException?

正如@Omar Kooheji所build议的:

 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 

我想你会不得不推出自己的:

 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 } } 

你可以使用instanceof关键字来代替C#的,但是没有像。

例:

 if(myThing instanceof Foo) { Foo myFoo = (Foo)myThing; //Never throws ClassCastException ... } 

你可以写这样的静态工具方法。 我不认为这是非常可读的,但它是你想要做的最好的近似。 如果你使用静态导入,在可读性方面也不会太差。

 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; } } 

这是一个testing用例,演示了它是如何工作的(并且它确实有效)。

 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); } } 

在Java 8中,您还可以使用可选的stream语法:

 Object o = new Integer(1); Optional.ofNullable(o) .filter(Number.class::isInstance) .map(Number.class::cast) .ifPresent(n -> System.out.print("o is a number")); 

我猜测你可以作为一个运营商creas

就像是

 as<T,Type> (left, right) which evaluates to if (typeof(left) == right) return (right)left else return null 

我不确定你会怎么做,现在我正在学习,自从我离开大学以后,我的Java帽子已经变得有点灰尘了。