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

なぜこれはfalseを返すのですか?明らかに、クラスBに次のように割り当てることができます。

B b = (B)a

エラーを返さないのに、なぜこれがfalseを返すのですか。それはそれ自身を説明する機能ではありませんか?私が望んでいることを実行する関数はありますか(つまり、私はそのクラスまたはそのサブクラスです)?

4

3 に答える 3

19

aあなたがしたいのが、の実際のタイプがサブタイプであるかどうかをテストすることBである場合、あなたはそれを逆に持っています:それは

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

これはgetClass()、変数の宣言されたクラスではなく、実際のクラスを返すためです。これは、変数に割り当てられたオブジェクトの実際のクラスであるa.getClass()クラス(C.class)を返し、実際にを割り当てることはできません。aCA aBC

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 に答える