在Java中,如果转换失败,尝试强制转换并获取
null
是否可行?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
您可以使用 instanceof
关键字来确定是否可以正确地进行类型转换。
return obj instanceof String?(String)obj: null;
当然可以将其泛型化并制成函数,但我认为问题是关于Java必须实现这一点的含义。public B nullCast(Object a) {
if (a instanceof B) {
return (B) a;
} else {
return null;
}
}
编辑:请注意,如果不添加目标类,您无法使B类成为泛型类(针对此示例)。这是因为泛型类型在instanceof
中不可用。
public <V, T extends V> T cast(V obj, Class<T> cls) {
if (cls.isInstance(obj)) {
return cls.cast(obj);
} else {
return null;
}
}
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;
}
我想这个也可以用泛型来完成,但我认为这可能不是所需的。
这个简单的方法接收一个对象并返回一个对象,因为类型转换在方法客户端中执行。
以上两种解决方案都有些笨拙:
强制类型转换和捕获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);
你可以捕获异常:
Foo f = null;
try {
f = Foo(bar);
}
catch (ClassCastException e) {}
或者检查类型:
Foo f = null;
if (bar instanceof Foo)
f = (Foo)bar;
SomeClassToCastTo object = null;
try {
SomeClassToCastTo object = SomeClassToCastTo.class.cast(anotherObject);
}
catch (ClassCastException e) {
object = null;
}
虽然不太美观,但应该能实现你想要的功能...
instanceof
运算符。 - Peter你可以处理这个捕获 ClassCastException 的异常
isAssignableFrom
会更好。 - C. Rossas
的设计,但是让我困扰的是使用Class
类的cast
方法会导致isInstance
方法被调用两次。在内部,该方法使用IsIsntance
方法来检查类型之间的兼容性。尽管如此,我们可以期望 JVM 可能会内联给定的as
函数中的cast
代码,并且 JIT 可能会删除对IsInstance
方法的冗余调用,但我们无法确定这一点。 - Miguel Gamboaas
运算符,因为它不会执行任何类型强制转换。至于C.Ross的评论,他的建议与此问题无关,他没有解释其中的任何好处。 - erickson