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


94

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

<? extends Object>

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



3
@Danその質問で「?extends Object」を検索すると、何も見つかりません。私は何かを推論できるかどうかを確認するために答えを読んでいますが、これはそれではないと思います。具体的には、ジェネリックについて話しているのではありません。
orbfish

@ダン-それは別の質問です。私は以前にこの質問を見たことがありますが、少なくとも微妙な違いについての言及を覚えています。私はそれを見つけることができるなら、私は見てみましょう...
ポールBellora

あなたはそれを見つける場合にも、この1ではありません。 stackoverflow.com/questions/678822/...
orbfish

1
いきます:Java無制限のワイルドカードが重複する可能性があります(Kevin Bourrillionによる間違った回答を掲載しています)
Paul Bellora

回答:


103

<?>そして<? 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
)

4
例がどのように関係しているのか分かりませんか?(<?>も<?extends Object>も使用しないため)
orbfish

27
@orbfish:extends Object実際意味のある例なので、面白いと思うだろうという点でのみ関連があります。間違えた場合はお詫び申し上げます。うまくいけば、それは少なくともあなたの質問に出くわす他の人々にとって興味があるでしょう。
ruakh

@ruakh-型パラメーターではなく境界付きワイルドカードに関心がありましたが、少なくとも、あなたは答えました。
orbfish 2011

1
そのときは、元の投稿でそのことを述べるべきでした。そうすれば、彼の答えはあなたにもっと関係があるかもしれません。
liltitus27 2013年

19

けれども<?>のショートカットことになって<? 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によるコレクションをご覧ください。


コンパイラがList <Object>に変換する場合、List <?>をどのように再定義可能にすることができますか?失われた?
Trismegistos 2017年

私が信じていること<?>は、レガシーAPIとの下位互換性のために設計されています。<Object>と<?ポストJava 5コードであるObject>を拡張します。
Dennis C

9

<?>の省略形です<? 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クラスから継承されていないTypeを受け入れることができます」が、すべてのJavaクラスはObjectクラスから継承されるか、暗黙的にクラスから継承されます。
hackjutsu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.