それは、クラス<でクラスを交換することをお勧めしますか?警告を回避するために>オブジェクトの拡張?
質問
私のコード内の場所「O束で、私はこのようなものを持っています:
public Class mySpecialMethod() {
return MySpecialClass.class;
}
警告の原因となる。
クラスは、生タイプです。への参照 ジェネリック型クラスでなければなりません パラメータ化された。
しかし、私は交換する場合は、
Class
タグ付き
Class<? extends Object>
の警告が表示されなくなります。
この簡単な練習OKですが、またはそれが後で問題を引き起こすだろうか?
解決
これは本当にClassオブジェクトを表現するために必要共通の基底クラスやインタフェースが存在しない場合にのみ行うには正しいことだ。
またClass<?>
を効果Class<? extends Object>
と同じである。
他のヒント
あなたが達成したい内容に応じて、あなたも、より正確にすることができます:
public Class<MySpecialClass> mySpecialMethod() {
return MySpecialClass.class;
}
そうでもないJavaプログラマが、ジェネリック医薬品に関するいくつかの良い論文を読んで。
はい、あなたは安全性を追加するために、いくつかのワイルドカードまたは正確なタイプ(Class<MySpecialClass>
)を追加する必要があります。その理由は、クラスがジェネリックであるということです。だから、Class<Bar>
とClass<Foo>
はそのジェネリック型パラメータの消去後も同じです。彼らはすべてClass
、いわゆる生タイプになります。コンパイルするときに消去が起こります。
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
からキャストして、あなたのための自動キャストを挿入することです。ジェネリック型Uと以前のJavaバージョンとの互換性の理由から、実行時に型Tと一緒に使用するかどうかと同じです。