2016-06-13 18 views
2

メソッドが返される理由は何ですか?Class<? extends |X|>を理解しようとしましたか?よりgetClassがClass <?を返すのはなぜですか? extends | X |>?

public final native Class<?> getClass();

openjdk周辺:

実際の結果型はClass<? extends |X|>|X|getClassが呼び出された 式の静的タイプの消去ある あります。

なぜgetClassは、例えば、XClass.classと同じ型を持つことはできません。

class Foo {} 
Foo fooInstance = new Foo(); 
Class<Foo> fc = Foo.class; // Works! 
Class<Foo> fc2 = fooInstance.getClass(); // Type mismatch ;(
Class<?> fc3 = fooInstance.getClass(); // Works! 
Class<? extends Foo> fc4 = fooInstance.getClass(); // Works! 
+0

関連します。http:// stackoverflow.com/questions/19332856/what-is-meant-by-the-erasure-of-the-static-type-of-the-expression-on-which-it-i and http://stackoverflow.com/質問/ 18144556/java-getclass-of-bounded-type – Tunaki

答えて

5
Foo foo = new SubFoo(); 

あなたはfoo.getClass()が戻ることを期待しますか? (SubFoo.classを返します)

これは全体の一部です。つまり、getClass()は参照型ではなく実際のオブジェクトのクラスを返します。それ以外の場合は、リファレンスタイプを書くことができます。foo.getClass()は決してFoo.classと異なるものではありませんので、とにかく2番目のタイプを書きます。

SubFoo.getClass()Foo.getClass()のサブタイプを返さないため、他の方法が好きで、getClass()が実際に型システムでは、独自の特殊な治療を持っていること、道ではなく、注意してください。)

+0

ルイス、ありがとう、私は最後に理解すると思います。 –

関連する問題