4

次のコードが警告を生成する理由がわかりません。

interface Generic<T> {
}

interface A {
}

class B {
    Generic<A> c;

    <T extends A> B(Generic<T> a) {
        c = (Generic<A>) a; //warning here
    }

}

//Unchecked cast from Generic<T> to Generic<A>

クラスBでは、タイプAのGenericのインスタンスの使用にのみ関心があります。この警告は、Generic引数をAではなくTとして格納する必要があることを示しています。

しかし、これは、Bジェネリックも宣言する必要があることを意味します。これにより、必要以上に複雑になるようです。

4

2 に答える 2

6

Javaジェネリックは不変であるため、これはダウンキャストでGeneric<T>はありません。TがAのサブタイプであっても、のサブタイプではありませんGeneric<A>。Aを返すジェネリックメソッドのみが必要な場合はGeneric<? extends A>、Bコンストラクターとストアするフィールドでワイルドカードを使用できます。参照。

于 2009-09-07T21:53:01.040 に答える
5

がのサブタイプであってもGeneric<T>、aはのサブタイプではないためです。Generic<A>TA

これを説明するために、次Stringのインスタンスを考えてみましょう。Object

List<String> listOfStrings = new ArrayList<String>();
List<Object> listOfObjects = (List<Object>)listOfStrings; // invalid
listOfObjects.add(new Date());
// now listOfStrings contain a date!

元のリストが破損する可能性があるため、コンパイラはそのキャストを許可しません。JVMは、実行時に一般的な境界要件を強制しません。

ここでの解決策は、フィールドcタイプを「Generic」として宣言することです。

于 2009-09-07T22:21:41.390 に答える