ここでは Java プログラマーではありませんが、ジェネリックに関する優れた論文を読んでください。
はい、安全性を高めるために、ワイルドカードまたは正確なタイプ ( Class<MySpecialClass>
) を追加する必要があります。その理由は、クラスがジェネリックであるためです。そのためClass<Bar>
、Class<Foo>
ジェネリック型パラメーターの消去後も同じです。それらはすべてClass
、いわゆる raw タイプになります。その消去はコンパイル時に発生します。これを説明するためのいくつかの例は、コンパイラが自動キャストを支援する場所です (簡潔にするために例外処理は省略されています)。
class Mine { }
class Vara {
public static void main(String... args) {
{ // works. translated to Mine m = (Mine) c.newInstance();
Class<Mine> c = Mine.class;
Mine m = c.newInstance();
}
{ // doesn't work. need a cast: Mine m = (Mine) c.newInstance();
Class c = Mine.class; // also Class<?> or Class<? extends Object>
Object o = c.newInstance(); // but this works. pointing to a Mine
Mine m = (Mine) c.newInstance(); // needs a manual cast
}
}
}
言ってClass<?>
(および同等のClass<? extends Object>
)、コンパイラーに、オブジェクトであるクラスが本当に必要でありT
、誤って生の型を使用しなかったことを伝えます。ただし、便利なキャストは追加されません。ジェネリックが行うことは、自動キャストを挿入しObject
て、目的の型にキャストすることだけです。ジェネリックは、古い Java バージョンとの互換性の理由から、実行時に U 型または T 型で使用されても同じです。