ワイルドカードがオブジェクトを意味するために以前に使用されているのを見たことがありますが、最近では次の使用が見られました:
<? extends Object>
すべてのオブジェクトがオブジェクトを拡張するため、これら2つの使用法は同義語ですか?
<?>
および<? extends Object>
は、ご想像のとおり同義です。
ジェネリックの場合、extends Object
は実際には冗長ではありません。例えば、 <T extends Object & Foo>
は消去時にT
をObject
にしますが、<T extends Foo>
消去中はFoo
になります。 (これは、Object
を使用したpre-generics APIとの互換性を維持しようとしている場合に問題になります。)
ソース: http://download.Oracle.com/javase/tutorial/extra/generics/convert.html ; JDKのJava.util.Collections
クラスには、次のシグネチャを持つメソッドがあります。
public static <T extends Object & Comparable<? super T>> T max(
Collection<? extends T> coll
)
<?>
は<? extend object>
のショートカットになるはずですが、2つの間にわずかな違いがあります。 <?>
は再構成可能ですが、<? extend object>
は再構成できません。彼らがこれをした理由は、再定義可能な型を区別しやすくするためです。 <? extends something>
、<T>
、<Integer>
のように見えるものはすべて、変更不可能です。
たとえば、このコードは機能します
List aList = new ArrayList<>();
boolean instanceTest = aList instanceof List<?>;
しかし、これはエラーを与えます
List aList = new ArrayList<>();
boolean instancetest = aList instanceof List<? extends Object>;
詳細については、Javaジェネリックおよびモーリスナフタリンによるコレクション
<?>
は<? extends Object>
の短縮形です。詳細については、以下の共有リンクをお読みください。
<?>
"?"
は不明なタイプを示し、コード内の任意のタイプを表すことができます。タイプがわからない場合は、このワイルドカードを使用します。
ArrayList<?> unknownList = new ArrayList<Number>(); //can accept of type Number
unknownList = new ArrayList<Float>(); //Float is of type Number
注:<?>
はすべてを意味します。したがって、Object
クラスから継承されていないTypeを受け入れることができます。
<? extends Object>
<? extends Object>
は、Object
クラスを拡張するオブジェクトまたはサブクラスを渡すことができることを意味します。
ArrayList<? extends Number> numberList = new ArrayList<Number>(); //Number of subclass
numberList = new ArrayList<Integer>(); //Integer extends Number
numberList = new ArrayList<Float>(); // Float extends Number
T –タイプを示すために使用
E –要素を示すために使用
K –キー
V-値
N –数字用
参照: