3

以下に示すようなコードスニペットがあります。

ArrayList<Integer>    a = new ArrayList<Integer>();
ListIterator<Integer> p = a.listIterator();

ただし、ListIteratorにを指定する必要がないことに気付いたので、それがなくてもコードは同じように機能します。

ArrayList<Integer>    a = new ArrayList<Integer>();
ListIterator p = a.listIterator();

Iteratorについても同じことが言えると思います。だから私の質問は、ListIterator /Iteratorのタイプをいつ指定する必要があるのか​​ということです。より冗長に使用できるのはオプションですか?

4

3 に答える 3

5

イテレータのジェネリック型を指定する理由は、イテレータが取得するアイテムをキャストせずに抽出できるようにするためです。これにより、コンパイル時の型の安全性が少し向上し、大きなオーバーヘッドが追加されることはないため、これを行わない理由はありません。

于 2012-07-15T16:55:48.433 に答える
2

あなたが参照しているものは、と呼ばれてgenericsいます。これは非常に強力なツールであり、とりわけ、コンパイル時にコレクションの型安全性を提供します。

Java Denericsのドキュメントページを見て、いつ、なぜ、どのように使用する必要があるかを確認してください。

さて、あなたの例に戻ってください-このコード:

Iterator it1 = a.iterator();          
Iterator<Integer> it2 = a.iterator();

it1.next();    // Compiler will assume, that this returns `Object`
               // because you did not define the type of the collection element 
               // for the Iterator.

it2.next();    // Compiler will assume, that this returns `Integer` 
               // because you said so in declaration.
于 2012-07-15T16:56:01.753 に答える
2

Iterator <T> / List <T>に型引数を提供する目的は、型の安全性です。つまり、コンパイラは、コンパイル時に、イテレータ/リストが処理できる型とプログラマが期待する型との間に不一致があるかどうかを確認できます。処理するために。

元:

 List aList = new ArrayList();
 Iterator it = aList.iterator();
 String s = (String)it.next() //compiles even if it iterates over a list of Integers

 List<Integer> aList = new ArrayList<Integer>();
 Iterator<Integer> it = aList.iterator();
 String s = it.next() //compilation error
于 2012-07-15T16:56:59.460 に答える