【发布时间】:2009-06-23 18:12:04
【问题描述】:
在 Java 中,如果转换失败,是否可以尝试转换并返回 null?
【问题讨论】:
在 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
【讨论】:
isAssignableFrom不是更好吗?
t.isAssignableFrom(o.getClass())?为什么会更好?
as 运算符相比有点不足,因为它不会执行任何类型的类型强制。至于 C. Ross 的评论,他的建议与该问题无关,他也没有解释其中的任何好处。
您可以使用instanceof 关键字来确定您是否可以正确投射。
return obj instanceof String?(String)obj: null;
当然,它可以被泛型化并制成函数,但我认为问题是 Java 必须通过什么手段来实现这一点。
【讨论】:
您可以,但不能使用 Java 中的单个函数:
public B nullCast(Object a) {
if (a instanceof B) {
return (B) a;
} else {
return null;
}
}
编辑:请注意,如果不添加目标类(这与 instanceof 无法使用泛型类型有关),则不能使 B 类通用(对于此示例):
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;
}
我想这也可以用泛型来完成,但我认为但这可能不是所需要的。
这个简单的方法接收 Object 并返回 Object,因为转换是在方法客户端中执行的。
【讨论】:
AFAIK,这将是(一种)方法:
SomeClassToCastTo object = null;
try {
SomeClassToCastTo object = SomeClassToCastTo.class.cast(anotherObject);
}
catch (ClassCastException e) {
object = null;
}
丑,但它应该做你想做的......
【讨论】:
instanceof 运算符。
在 Java 中,如果强制转换失败,您将收到 ClassCastException。您可以捕获异常并将目标对象设置为空。
【讨论】:
您可以捕获异常:
Foo f = null;
try {
f = Foo(bar);
}
catch (ClassCastException e) {}
或检查类型:
Foo f = null;
if (bar instanceof Foo)
f = (Foo)bar;
【讨论】:
上面的两种方案都有些别扭:
铸造和捕获 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);
【讨论】:
你可以处理这个捕获的 ClassCastException
【讨论】: