3

我有一个代码片段,如下所示:

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

但是,我注意到您实际上并不需要为 ListIterator 指定 ,因此没有它,代码的工作方式相同:

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

我认为迭代器也是如此。所以我的问题是我什么时候必须指定 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 回答