web-dev-qa-db-ja.com

<?>と<?の違いは何ですか? Object>の拡張Java Generics?

ワイルドカードがオブジェクトを意味するために以前に使用されているのを見たことがありますが、最近では次の使用が見られました:

<? extends Object>

すべてのオブジェクトがオブジェクトを拡張するため、これら2つの使用法は同義語ですか?

85
orbfish

<?>および<? extends Object>は、ご想像のとおり同義です。

ジェネリックの場合、extends Objectは実際には冗長ではありません。例えば、 <T extends Object & Foo>は消去時にTObjectにしますが、<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
)
95
ruakh

<?><? 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ジェネリックおよびモーリスナフタリンによるコレクション

19

<?><? 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 

enter image description here

T –タイプを示すために使用
E –要素を示すために使用
K –キー
V-値
N –数字用
参照:

enter image description here

8
roottraveller