以前にワイルドカードがオブジェクトを意味するために使用されているのを見てきましたが、最近、次の使用が見られました。
<? extends Object>
すべてのオブジェクトはオブジェクトを拡張するので、これら2つの使用法は同義ですか?
以前にワイルドカードがオブジェクトを意味するために使用されているのを見てきましたが、最近、次の使用が見られました。
<? extends Object>
すべてのオブジェクトはオブジェクトを拡張するので、これら2つの使用法は同義ですか?
回答:
<?>
そして<? extends Object>
、あなたが期待するように、同義語です。
ジェネリックがextends Object
実際に冗長ではない場合がいくつかあります。例えば、<T extends Object & Foo>
原因となりますT
となることObject
で、一方、消去の下で<T extends Foo>
、それはなりますFoo
消去下。(これは、を使用していたジェネリック以前のAPIとの互換性を維持しようとしている場合に問題になる可能性がありますObject
。)
ソース: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
)
extends Object
実際に意味のある例なので、面白いと思うだろうという点でのみ関連があります。間違えた場合はお詫び申し上げます。うまくいけば、それは少なくともあなたの質問に出くわす他の人々にとって興味があるでしょう。
けれども<?>
のショートカットことになって<? extend object>
、両者の間にわずかな違いがあります。
<?>
はreifiableですが、そうで<? extend object>
はありません。彼らがこれを行った理由は、reifiableタイプを区別しやすくするためです。ルックスが好きというものは<? extends something>
、<T>
、<Integer>
nonreifiableです。
たとえば、このコードは機能します
List aList = new ArrayList<>();
boolean instanceTest = aList instanceof List<?>;
しかし、これはエラーになります
List aList = new ArrayList<>();
boolean instancetest = aList instanceof List<? extends Object>;
詳細については、JavaジェネリックとMaurice Naftalinによるコレクションをご覧ください。
<?>
の省略形です<? 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 –番号を示すために使用
Ref:
Object
クラスから継承されるか、暗黙的にクラスから継承されます。