List<?>
はどういう意味ですか、それは単に、指定されていないタイプのオブジェクトのリストを意味するのですか?
文字列<?>
をグーグルすると、何も返されません(:
詳細情報を取得するために必要なキーワードは ワイルドカード です。
トムが言ったように、?
、または無制限のワイルドカードは、オブジェクトのタイプが指定されていないことを意味します。不明である可能性、複数の可能な値を意味する可能性がある、または単に無関係である可能性があります。あなたの例、List<?>
は「不明なリスト」と発音されます。柔軟性があるので便利ですが、ランダムなオブジェクトを押し込んで未知のグループから完全に免除することができないため、いくつかの落とし穴もあります。
リソース:
ちなみに、Googleは特殊文字を追跡しないため、Google検索は失敗しました。
一部の例外を除いて、句読点は無視されます(つまり、@#$%^&*()= + [] \およびその他の特殊文字は検索できません)。
(編集:昨夜これを書いたときは本当に疲れていたに違いありません。フォーマットをクリーンアップし、少し情報を追加しました。)
この質問に回答するには、無制限のワイルドカードと制限付きのワイルドカードについて説明する必要があります。
この投稿のコンテンツは、Javaのドキュメントから作成されています。
無制限のワイルドカードタイプは、ワイルドカード文字(
?
)を使用して指定されます(例:List<?>
)。これは、不明なタイプのリストと呼ばれます。無制限のワイルドカードが役立つアプローチには、次の2つのシナリオがあります。
Objectクラスで提供される機能を使用して実装できるメソッドを記述している場合。
コードが、型パラメーターに依存しないジェネリッククラスのメソッドを使用している場合。たとえば、
List.size
やList.clear
などです。実際、Class<?>
のほとんどのメソッドはT
に依存しないため、Class<T>
がよく使用されます。
長方形や円などの形状を描画できる単純な描画アプリケーションを考えてみましょう。プログラム内でこれらの形状を表すには、次のようなクラス階層を定義できます。
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のサブクラスです。
Javaジェネリックスに関するドキュメントを探す必要があるようです。
List<?>
は、現在指定されていないタイプに基づくオブジェクトであることを意味します。その指定は、クラスがインスタンス化されるときに行われます。
例えば:
List<String> listOfStrings = new ArrayList<String>();
stringオブジェクトのリストです。
List
は、自分で実装できるインターフェースであり、一部のJavaコレクション、Vector
などでも実装できます。
山かっこを使用して、コンパイル時のタイピング情報を提供できます。最も一般的なタイプはObject
で、List<Object>
。 <?>
は、Object
またはObject
のサブクラスのリストを示しています。これはList<? extends Object>
、またはList<? extends Foo>
、ここでList
には、Foo
のサブクラスのオブジェクトまたはFoo
自体のオブジェクトが含まれます。
List
をインスタンス化することはできません。これはインターフェースであり、実装ではありません。
_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
_
コレクションから要素を取り出すときは、コレクションに格納されている要素のタイプにキャストする必要があります。これは不便であるだけでなく、安全ではありません。コンパイラーは、キャストがコレクションのタイプと同じであることをチェックしないため、実行時にキャストが失敗する可能性があります。
Genericsは、コレクションのタイプをコンパイラーに通知して、チェックできるようにする方法を提供します。コンパイラーがコレクションの要素タイプを認識すると、コンパイラーは、コレクションが一貫して使用されていることを確認し、コレクションから取り出される値に正しいキャストを挿入できます。
?ジェネリックスではワイルドカードにすぎない
Genericsには3種類のワイルドカードがあります
1)上限のあるワイルドカード:使用はキーワードを拡張します
eg: List<? extends SuperClass>
2)下限のワイルドカード
eg:Uses Super key Word List<? super SubClass>
3)無制限のワイルドカード
List<?> list