web-dev-qa-db-ja.com

Java Generics?)のList <?>はどういう意味ですか?

List<?>はどういう意味ですか、それは単に、指定されていないタイプのオブジェクトのリストを意味するのですか?

文字列<?>をグーグルすると、何も返されません(:

42
corydoras

詳細情報を取得するために必要なキーワードは ワイルドカード です。

32
Chris Pitman

トムが言ったように、?、または無制限のワイルドカードは、オブジェクトのタイプが指定されていないことを意味します。不明である可能性、複数の可能な値を意味する可能性がある、または単に無関係である可能性があります。あなたの例、List<?>は「不明なリスト」と発音されます。柔軟性があるので便利ですが、ランダムなオブジェクトを押し込んで未知のグループから完全に免除することができないため、いくつかの落とし穴もあります。

リソース:

  • ワイルドカードについては、Javaチュートリアルの here で説明しています。
  • 良い-冗長な場合-Angelika Langerによる一般的なジェネリック全般に関するチュートリアル here があります。
  • そして、もう一つの良い概要があります ここ (PDF)ギラド・ブラチャ; 5〜7ページをご覧ください。
  • 最後に、Josh BlochによるEffective Javaを手に入れることができる場合は、ジェネリックと、できる場合、できる場合についての素晴らしいセクションがあります。 t、ワイルドカードを使用する必要があります(使用しないでください)(第5版、第2版の109-146ページ)。

ちなみに、Googleは特殊文字を追跡しないため、Google検索は失敗しました。

一部の例外を除いて、句読点は無視されます(つまり、@#$%^&*()= + [] \およびその他の特殊文字は検索できません)。

- Googleヘルプページ

(編集:昨夜これを書いたときは本当に疲れていたに違いありません。フォーマットをクリーンアップし、少し情報を追加しました。)

43
Pops

この質問に回答するには、無制限のワイルドカードと制限付きのワイルドカードについて説明する必要があります。
この投稿のコンテンツは、Javaのドキュメントから作成されています。

1.無制限のワイルドカード

無制限のワイルドカードタイプは、ワイルドカード文字(?)を使用して指定されます(例:List<?>)。これは、不明なタイプのリストと呼ばれます。無制限のワイルドカードが役立つアプローチには、次の2つのシナリオがあります。

  • Objectクラスで提供される機能を使用して実装できるメソッドを記述している場合。

  • コードが、型パラメーターに依存しないジェネリッククラスのメソッドを使用している場合。たとえば、List.sizeList.clearなどです。実際、Class<?>のほとんどのメソッドはTに依存しないため、Class<T>がよく使用されます。

2.境界付きワイルドカード

長方形や円などの形状を描画できる単純な描画アプリケーションを考えてみましょう。プログラム内でこれらの形状を表すには、次のようなクラス階層を定義できます。

public abstract class Shape {
    public abstract void draw(Canvas c);
}

public class Circle extends Shape {
    private int x, y, radius;
    public void draw(Canvas c) {
        ...
    }
}

public class Rectangle extends Shape {
    private int x, y, width, height;
    public void draw(Canvas c) {
        ...
    }
}

これらのクラスはキャンバスに描画できます。

public class Canvas {
    public void draw(Shape s) {
        s.draw(this);
   }
}

すべての図面には通常、いくつかの形状が含まれます。それらがリストとして表されていると仮定すると、それらをすべて描画するCanvasのメソッドがあると便利です。

public void drawAll(List<Shape> shapes) {
    for (Shape s: shapes) {
        s.draw(this);
   }
}

現在、タイプルールは、drawAll()は正確にShapeのリストでのみ呼び出すことができると言っています。たとえば、List<Circle>で呼び出すことはできません。メソッドが行うことはすべてリストから形状を読み取ることなので、これは残念です。そのため、List<Circle>で呼び出すこともできます。私たちが本当に望んでいるのは、メソッドがあらゆる種類の形状のリストを受け入れることです。public void drawAll(List shapes){...}ここには小さな、しかし非常に重要な違いがあります。型List<Shape>List<? extends Shape>に置き換えました。これでdrawAll()Shapeのサブクラスのリストを受け入れるため、必要に応じてList<Circle>で呼び出すことができます。

List<? extends Shape>は、制限付きワイルドカードの例です。 ?は不明なタイプを表しますが、この場合、この不明なタイプは実際にはShapeのサブタイプであることがわかります。 (注:Shape自体または一部のサブクラスである可能性があります。Shapeを文字通り拡張する必要はありません。)Shapeは、ワイルドカードの上限であると言います。

同様に、境界付きワイルドカードである構文? super Tは、Tのスーパータイプである不明なタイプを示します。たとえば、ArrayedHeap280<? super Integer>には、ArrayedHeap280<Integer>ArrayedHeap280<Number>、およびArrayedHeap280<Object>が含まれます。 JavaクラスのIntegerクラスのドキュメント を見るとわかるように、IntegerはNumberのサブクラスであり、Objectのサブクラスです。

6
Farhad Maleki

Javaジェネリックスに関するドキュメントを探す必要があるようです。

List<?>は、現在指定されていないタイプに基づくオブジェクトであることを意味します。その指定は、クラスがインスタンス化されるときに行われます。

例えば:

List<String> listOfStrings = new ArrayList<String>();

stringオブジェクトのリストです。

4
Tom Duckering

Listは、自分で実装できるインターフェースであり、一部のJavaコレクション、Vectorなどでも実装できます。

山かっこを使用して、コンパイル時のタイピング情報を提供できます。最も一般的なタイプはObjectで、List<Object><?>は、ObjectまたはObjectのサブクラスのリストを示しています。これはList<? extends Object>、またはList<? extends Foo>、ここでListには、FooのサブクラスのオブジェクトまたはFoo自体のオブジェクトが含まれます。

Listをインスタンス化することはできません。これはインターフェースであり、実装ではありません。

3
Jonathon Faust

_List<?>_は_List<? extends Object>_を表すので、_Collection<E>_にはcontainsAll(Collection<?> c)があり、これを使用して記述できます。

_List<Object> objs = Arrays.<Object>asList("one",2,3.14,4);
List<Integer> ints = Arrays.asList(2,4);
assert objs.containsAll(ints);//true
_
2
non sequitor

コレクションから要素を取り出すときは、コレクションに格納されている要素のタイプにキャストする必要があります。これは不便であるだけでなく、安全ではありません。コンパイラーは、キャストがコレクションのタイプと同じであることをチェックしないため、実行時にキャストが失敗する可能性があります。

Genericsは、コレクションのタイプをコンパイラーに通知して、チェックできるようにする方法を提供します。コンパイラーがコレクションの要素タイプを認識すると、コンパイラーは、コレクションが一貫して使用されていることを確認し、コレクションから取り出される値に正しいキャストを挿入できます。

chk dis pdf

0
Summy

?ジェネリックスではワイルドカードにすぎない

Genericsには3種類のワイルドカードがあります

1)上限のあるワイルドカード:使用はキーワードを拡張します

eg: List<? extends SuperClass>

2)下限のワイルドカード

eg:Uses Super key Word List<? super SubClass>

3)無制限のワイルドカード

List<?> list
0