ジェネリックスを使っていろいろなことを知りました。以下の例では、doStuff1
コンパイルしかしdoStuff2
ません:Java:有界型のgetClass()
public <T extends Foo> void doStuff1(T value) {
Class<? extends Foo> theClass = value.getClass();
}
public <T extends Foo> void doStuff2(T value) {
Class<? extends T> theClass = value.getClass();
}
だから、私はObject.getClass()
のドキュメントを見て、これを見つけた:
実際の結果型がクラス<のですか?拡張| X | >ここで、| X | getClassが呼び出される静的型の式の消去です。
これはちょっと好奇心が強い。 getClass()
はなぜこのように設計されていますか?該当する場合、タイプを生のクラスに変換することは理解できますが、どうしてそれらも必ずT
を殺すようにしなければならないという明白な理由はありません。それはまたそれを取り除く特定の理由はありますか、それはちょうど一般的な "それは簡単ですので、すべてを取り除いてみましょう、誰がそれはとにかくそれを必要とする"アプローチ?
これを理解すると、頭が痛くなります。あまり遅くなくてもジェネリック型境界を計算することは嫌いです。 [JLS for 'Object'](http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.3.2)から検索をお勧めしますルール。これはおそらく、JVMがオブジェクトのランタイムクラスを反映するためにそのような魔法のような魔法をどのように行うかの成果物でしょう。 – chrylis