2012-09-20 14 views
7

のために、このような何かisAssignableFromは、だから私はクラスが多くのサブクラスを含むスーパークラスに割り当て可能であるかどうかを確認したいサブクラス

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を返すんがtrueを返していません?

B b = (B)a 

がエラーを返さないので、なぜこれがfalseを返すよう明らかに、それは、クラスBに割り当てることができます。それはそれ自体として記述する関数ではありませんか?私に欲しいものを達成する機能がありますか(つまり私はそのクラスかそれのサブクラスですか?)

答えて

14

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

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

ありがとうございました、私は過去1時間のようにこれと戦ってきました。今私は馬鹿のように感じる)。 –

5

getClass()が実際のクラスではなく、変数の宣言されたクラス返すので、これは - 、a.getClass()クラスC(C.class)が返される変数A aに割り当てられたオブジェクトの実際のクラスであるとクラスBは何isAssignableFrom()テストである、クラスCを実装/拡張していないので、あなたは確かにC

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

+0

だ私が言うことができる方法はあります、これですクラス、私が望むクラス、またはそれのサブクラス? –

+3

はい、 'isAssignableFrom'です。しかし、あなたは 'B.class.isAssignableFrom(a.getClass())'を意味するかもしれないと思います。 –

+0

@LouisWassermanああ、あなたはそれを釘付け、それはまさに私が望んでいたものです。そのコメントを記した回答を投稿したい場合は、それをマークします。私は逆にしたいものを書きました。 –

0

Bを割り当てることはできません。あなたの例によると、クラスBのインスタンスはクラスCのインスタンスかもしれません。これをテストするには、 'instanceof'を使用してください。

関連する問題