9

私のコードのたくさんの場所で、私は次のようなものを持っています:

public Class mySpecialMethod() {
  return MySpecialClass.class;
}

これは警告を引き起こします

クラスは生の型です。ジェネリック型クラスへの参照は、パラメーター化する必要があります。

でも、交換したら

Class

Class<? extends Object>

警告は消えます。

この簡単な方法は問題ありませんか、それとも後で問題を引き起こす可能性がありますか?

4

4 に答える 4

15

Class オブジェクトが表現する必要がある共通の基本クラスまたはインターフェイスが本当に存在しない場合にのみ行うのが正しいことです。

またClass<?>、実質的には と同じClass<? extends Object>です。

于 2008-12-16T08:08:56.580 に答える
6

はい、その通りです。

タイプを指定する必要があります。できない場合は、ワイルドカードを指定する必要があります。

さらに読む: Java 言語仕様: パラメータ化された型

于 2008-12-16T07:05:19.657 に答える
4

ここでは 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 型で使用されても同じです。

于 2008-12-16T08:05:53.903 に答える