それは、クラス<でクラスを交換することをお勧めしますか?警告を回避するために>オブジェクトの拡張?

StackOverflow https://stackoverflow.com/questions/370601

質問

私のコード内の場所「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と一緒に使用するかどうかと同じです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top