4

注: 純粋に好奇心からであり、実際の使用例ではありません。

Class Class有効な型パラメーターを使用してオブジェクトを宣言する方法があるかどうか疑問に思っています。

Class cc1 = Class.class; //raw type
Class<Class> cc2 = Class.class; //now parameter is raw type
Class<Class<?>> cc3 = Class.class; //compile error: inconvertible types

Classとが交換可能である場合Class<?>、なぜ交換可能ではClass<Class>ないのClass<Class<?>>ですか?

編集:質問は、ネストされた生の型パラメーターの問題に一般化できます。例えば:

ArrayList<ArrayList<?>> lst = new ArrayList<ArrayList>(); //same compile error

EDIT2:質問を少し言い換える必要があります:私はそれを知っています

Class<?> c = Class.class;

Class<Class>は有効ですが、なぜ同じではないのか疑問に思っていますClass<Class<?>>

4

3 に答える 3

2

何を求めているのか (または何をしようとしているのか) を正確に把握するのはちょっと難しいですが、生の型を使わずにパラメータ化することはできます。

Class<? extends Object> cc4 = Class.class; // no raw types
Class<?> cc5 = Class.class; // also an option

最後の例に関する限り、 を保持する配列リストの配列リストを作成したいように見えるため、意味が?ありませんが、宣言は を保持する配列リストの配列リストを宣言していません?

適切に記述された (ただし適切な Java ではない) とすれば、次のようになります。

ArrayList<ArrayList<?>> lst = new ArrayList<ArrayList<Integer>>(); // Type mismatch

これは予想されます。次のようなものが機能しないのと同じ理由で機能しません。

Object o = new Object();
Integer i = new Integer(3);

o = i;
i.floatValue();
o.floatValue(); // can't access that method, we need to specifically cast it to Integer

Java 型は (継承チェーンであっても) プロアクティブに推論されません。

ワイルドカードをそこに残しておきたい場合は、次のことを歓迎します。

ArrayList<ArrayList<?>> lst = new ArrayList<ArrayList<?>>(); // works!
于 2011-05-20T00:02:43.783 に答える
2

ここでの規則は、左側のジェネリック型が右側のジェネリック型と一致する必要があるということです。

Class<?>任意のタイプのクラスを意味します。

Class<?> c = Class.class; 

任意のタイプの Class が になる可能性があるため、機能しますClass<Class>

Class<Class<?>> cc3 = Class.class;

Class.class タイプがタイプClass<Class>ではないため、機能しませんClass<Class<?>>

ArrayList<ArrayList<Integer>> lst = new ArrayList<ArrayList<Integer>>();
ArrayList<ArrayList<?>> lst = new ArrayList<ArrayList<?>>();

2 つの式が一致するため、機能します。

ArrayList<ArrayList<?>> lst = new ArrayList<ArrayList>();

一致しない。

于 2011-05-20T00:04:22.400 に答える
2

ジェネリックにはかなり深刻な制限があります。この場合Class<Class>、生の型の実装ではなく生の型を実際に参照しているため、型を内部型に割り当てることはできません。警告が表示されますが、その警告を修正する方法はありません。

Class<Class<?>>Class<Class<T>>それ自体は変換できない型ではありません。 type がなく、 type があるため、クラスを直接割り当てることはできませんClass<T>

別の方法で考えてみてください。試してみてくださいList<List<String>>。それを作成するには、文字列のリストを取るリストを作成する必要があります。リストにはリストを含めることができるため、これは機能します。

Class はデータ オブジェクトというよりもプリミティブに似ているため、他の種類の Class の Class を作成することはできないと思います。

編集:あなたの追加の質問ArrayList<ArrayList<?>>は、あなたが抱えている変換不可能な型の問題のより明白な例ですClass<Class<?>>

于 2011-05-20T00:09:00.917 に答える