在Java中,如果演员表失败,是否可以尝试演员并返回null
?
答案 0 :(得分:52)
public static <T> T as(Class<T> t, Object o) {
return t.isInstance(o) ? t.cast(o) : null;
}
用法:
MyType a = as(MyType.class, new MyType());
// 'a' is not null
MyType b = as(MyType.class, "");
// b is null
答案 1 :(得分:29)
您可以使用instanceof
关键字来确定是否可以正确投射。
return obj instanceof String?(String)obj: null;
当然它可以被泛化并成为函数,但我认为问题是Java必须实现的目的。
答案 2 :(得分:5)
您可以,但不能使用Java中的单个函数:
public B nullCast(Object a) {
if (a instanceof B) {
return (B) a;
} else {
return null;
}
}
编辑:请注意,如果不添加目标类,则无法使B类成为通用(对于此示例)(这与instanceof
无法使用泛型类型的事实有关):< / p>
public <V, T extends V> T cast(V obj, Class<T> cls) {
if (cls.isInstance(obj)) {
return cls.cast(obj);
} else {
return null;
}
}
答案 3 :(得分:2)
MyType e = ( MyType ) orNull( object, MyType.class );
// if "object" is not an instanceof MyType, then e will be null.
...
public static Object orNull( Object o , Class type ) {
return type.isIntance( o ) ? o : null;
}
我想这也可能以某种方式完成了泛型,但我认为但可能不是所需要的。
这个简单的方法接收Object并返回Object,因为强制转换是在方法客户端中执行的。
答案 4 :(得分:0)
AFAIK,这将是(一)这样做的方法:
SomeClassToCastTo object = null;
try {
SomeClassToCastTo object = SomeClassToCastTo.class.cast(anotherObject);
}
catch (ClassCastException e) {
object = null;
}
丑陋,但它应该做你想要的......
答案 5 :(得分:0)
在Java中,如果转换失败,您将获得ClassCastException。您可以捕获异常并将目标对象设置为null。
答案 6 :(得分:0)
您可以捕获异常:
Foo f = null;
try {
f = Foo(bar);
}
catch (ClassCastException e) {}
或检查类型:
Foo f = null;
if (bar instanceof Foo)
f = (Foo)bar;
答案 7 :(得分:0)
上述两种解决方案有些尴尬:
转换和捕获ClassCastException:创建异常对象可能很昂贵(例如计算堆栈跟踪)。
前面描述的nullCast方法意味着您需要为要执行的每个转换生成一个强制转换方法。
泛型因“类型擦除”而失败了......
您可以创建一个静态辅助方法,保证返回目标类的实例或null,然后转换结果而不用担心异常:
public static Object nullCast(Object source, Class target) {
if (target.isAssignableFrom(source.getClass())) {
return target.cast(source);
} else {
return null;
}
}
示例电话:
Foo fooInstance = (Foo) nullCast(barInstance, Foo.class);
答案 8 :(得分:-1)
你可以处理这个捕捉ClassCastException