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

gar*_*ndi 30 java casting

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

public abstract class Parent{
    public Parent(){
    }
}

public class ChildA extends Parent {
    public ChildA {
    }
}

public class ChildB extends Parent {
    public ChildB {
    }
}
Run Code Online (Sandbox Code Playgroud)

在C#中,我可以通过以下方式处理某种类型安全的方式:

ChildA child = obj as ChildA;
Run Code Online (Sandbox Code Playgroud)

如果它不是ChildA类型对象,那么会使child == null.如果我这样做:

ChildA child = (ChildA)obj;
Run Code Online (Sandbox Code Playgroud)

...在C#中,如果类型不正确,则会抛出异常.

所以基本上,有没有办法在Java中进行第一种类型的转换?谢谢.

Ale*_*s G 58

我无法想到语言本身的一种方式,但你可以像这样轻松地模仿它:

ChildA child = (obj instanceof ChildA ? (ChildA)obj : null);
Run Code Online (Sandbox Code Playgroud)


Dmi*_*kov 13

在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"));
Run Code Online (Sandbox Code Playgroud)

  • Number.class::cast 太棒了!这个太棒了! (3认同)

Fab*_*_75 12

您可以使用与所有java类型兼容的此方法:

public static <T> T safeCast(Object o, Class<T> clazz) {
    return clazz != null && clazz.isInstance(o) ? clazz.cast(o) : null;
}
Run Code Online (Sandbox Code Playgroud)

示例:

// A given object obj
Integer i = safeCast(obj, Integer.class);
Run Code Online (Sandbox Code Playgroud)


ase*_*ovm 8

您可以使用该instanceof运算符.

if(obj instanceof ChildA){
     final ChildA child = (ChildA) obj;
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ser 5

在现代 Java 中你会使用

if (obj instanceof ChildA childa) {

}
Run Code Online (Sandbox Code Playgroud)

这与现代 C# 几乎相同

if (animal is Dog dog)
{
    // Use dog here
}
Run Code Online (Sandbox Code Playgroud)