8

所以我想检查一个类是否可以分配给一个包含许多子类的超类,就像这样

public class A { 
    public A(){ }
}

public class B extends A { 
    public B(){ }
}

public class C extends B {
    public C(){ }
}

public static void main() {
    A a = new C();
    boolean whyAmIFalse = a.getClass().isAssignableFrom(B.class);
}

为什么这会返回假?显然它可以分配给B类

B b = (B)a

不返回错误,那么为什么返回false。它不是它所描述的功能吗?是否有一个功能可以完成我想要的功能(即我是那个类或它的子类)?

4

3 回答 3

19

如果你想要做的是测试a's 的实际类型是B还是子类型,你已经把它倒过来了:它是

 B.class.isAssignableFrom(a.getClass());
于 2012-09-20T23:33:37.073 回答
5

这是因为getClass()返回实际类,而不是变量的声明类——a.getClass()将返回类C(C.class),这是分配给变量的对象的实际类,A a您确实不能将 a 分配B给一个C

http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#getClass()

于 2012-09-20T23:21:59.880 回答
0

因为 B 类不扩展/实现 C 类,这是 isAssignableFrom() 测试的。根据您的示例,B 类的实例可能是 C 类的实例。要对此进行测试,请使用“instanceof”。

于 2012-09-20T23:23:11.857 回答