【问题标题】:isAssignableFrom doesn't return true for sub-classisAssignableFrom 不为子类返回 true
【发布时间】:2012-09-20 23:18:38
【问题描述】:

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

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);
}

为什么返回 false?显然它可以分配给B类作为

B b = (B)a

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

【问题讨论】:

    标签: java inheritance subclass


    【解决方案1】:

    如果你想做的是测试a 的实际类型是B 还是一个子类型,你就倒过来了:它是

     B.class.isAssignableFrom(a.getClass());
    

    【讨论】:

    • 谢谢您,先生,过去一个小时我一直在与此作斗争。我现在觉得自己像个白痴=)。
    【解决方案2】:

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

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

    【讨论】:

    • 有什么办法可以说,这个类是我想要的类还是它的任何子类?
    • 是的,isAssignableFrom。但我怀疑你的意思可能是B.class.isAssignableFrom(a.getClass()),而不是相反。
    • @LouisWasserman 哦,你搞定了,这正是我想要的。如果您想发布带有该评论的答案,我会标记它,我只是写了我想要的内容。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-22
      • 1970-01-01
      • 2023-02-16
      • 1970-01-01
      • 2012-06-24
      • 1970-01-01
      相关资源
      最近更新 更多