假设我有两个派生自第三个抽象类的类:
public abstract class Parent{
public Parent(){
}
}
public class ChildA extends Parent {
public ChildA {
}
}
public class ChildB extends Parent {
public ChildB {
}
}
在C#中,我可以通过以下方式处理某种类型安全的投射:
ChildA child = obj as ChildA;
如果它不是ChildA类型对象,那么会使child == null。如果我这样做:
ChildA child = (ChildA)obj;
...在C#中,如果类型不正确,这将引发异常。
基本上,有没有办法在Java中进行第一种类型的转换?感谢。
答案 0 :(得分:55)
我无法想到语言本身的一种方式,但你可以像这样轻松地模仿它:
ChildA child = (obj instanceof ChildA ? (ChildA)obj : null);
答案 1 :(得分:12)
在java 8中,您还可以使用带有Optional:
的流语法 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"));
答案 2 :(得分:9)
您可以使用与所有java类型兼容的此方法:
public static <T> T safeCast(Object o, Class<T> clazz) {
return clazz != null && clazz.isInstance(o) ? clazz.cast(o) : null;
}
示例:
// A given object obj
Integer i = safeCast(obj, Integer.class);
答案 3 :(得分:7)
您可以使用instanceof
运算符。
if(obj instanceof ChildA){
final ChildA child = (ChildA) obj;
}
答案 4 :(得分:2)
您可以随时查看:
if (child instanceof ChildA) {
ChildA child = (ChildA) child;
// Do stuff.
}
或者只是快速方法:
public ChildA getInstance(Parent p) {
if (child instanceof ChildA) {
return (ChildA) p;
} else {
return null;
}
}
答案 5 :(得分:1)
我认为解决这个问题的最佳方法是使用泛型方法。 这是我认为最可重用/安全的选择。
以下是我的意见:
@SuppressWarnings("unchecked")
public <E> E coerceTo(Object o, Class<E> target) throws IllegalArgumentException {
if(target.isInstance(o)) return (E)o;
String msg = "expected "+target.getName()+" but was "+o.getClass().getName();
throw new IllegalArgumentException(msg);
}
请注意,此处,演员阵容是安全的,添加 suppressWarnings 注释是正确的。
以下是如何调用该方法的示例:
Object o = 1;
int a = coerceTo(o, Integer.class);