Java中是否有一种“类型安全”的转换形式?

时间:2011-12-27 22:32:47

标签: java casting

假设我有两个派生自第三个抽象类的类:

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中进行第一种类型的转换?感谢。

6 个答案:

答案 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);