6

Listとはどう違いList<?>ますか?に要素を追加できないことはわかっていList<?>ます。私はコードをもっている:

List<String> myList = new ArrayList<String>();
processList(myList);
processListGeneric(myList);

public static void processList(List myList) {
Iterator it = myList.iterator();
while(it.hasNext())
    System.out.println(it.next());
}

public static void processListGeneric(List<?> myList) {
    Iterator<?> it = myList.iterator();
    while(it.hasNext())
        System.out.println(it.next());
}

コンパイル時エラーが発生するため、2 つのメソッドの名前を同じにすることはできません。では、これら2つのアプローチに違いはありますか?

4

7 に答える 7

1

List<?>違いは、未知のタイプの List であるため、a には何も追加できないことです。

たとえば、次のことはできません。

List<Integer> listOfInt = new ArrayList<Integer>();
List<?> list = listOfInt;
list.add("hello?"); // Compile-time error

Listリスト項目のタイプはチェックされないため、基本タイプには何でも追加できます。

于 2013-06-04T10:06:56.053 に答える
0

2 番目の方法では、ジェネリック (Java 5 で導入) を使用します。

重要な違いの 1 つは、次の<?>ようなオブジェクトではなく、単一の型を表すことです。

List<? extends Object> myList

したがって、リストに任意のオブジェクトを追加できるため、最初の方法 (ワイルドカード構文なし) を使用する方がより柔軟であると言えます。ただし、宣言をパラメーター化する必要があるという (コンパイラーの) 警告が表示されます。

無制限のワイルドカード構文を使用する<?>と警告が回避されますが、実際にジェネリックを使用して型の安全性を強制するのではなく、任意の型のリストになる可能性があることをコンパイラに伝えています。アプリケーションの型を安全にするために、ジェネリックを使用することを強くお勧めします。

たとえば、リストに String オブジェクトのみを含める必要があることがわかっている場合は、次のように宣言します。

List<String> myList

instanceof次に、演算子の使用などの不必要なキャストを回避します。

参考までに、Java のジェネリックに関する簡単なチュートリアルを次に示します。

http://javarevisited.blogspot.co.uk/2011/09/generics-java-example-tutorial.html

于 2013-06-04T10:09:04.297 に答える
0

どちらも同じように動作します。パラメータ化された表記法を使用すると、Java5 以降での警告を回避できます。タイプ消去コンパイル済みユニットが原因で、同じクラス ファイルにまったく同じシグネチャを持つ 2 つのメソッドがあり、言語規則に違反しているため、同じ Java ファイルに両方の構文を含めることはできません。以下は、コンパイラから得られるものです。

メソッド processList(List) は、タイプの別のメソッドと同じ消去 processList(List) を持っています ...

于 2013-06-04T10:15:00.153 に答える
0

List は raw 型で、List< ?> はワイルドカード型です。http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.htmlを見てください

于 2013-06-04T10:13:50.430 に答える