'iterator()'方法是Iterable接口中的一个方法。此方法返回实现Iterator接口的类的对象。 由于Collection接口扩展了Iterable接口,因此它从它继承了'iterator()'方法(Iterable接口)。 因此,实现Collection接口的类的任何对象都可以调用'iterator()'方法。
我们假设我实例化一个实现Collection接口的类,如下所示:
List<String> names = new LinkedList<String>();
在实例化之后,我将对象添加到集合中,如下所示:
names.add("John");
names.add("Joe");
现在,如果我想要迭代器对象迭代String对象的集合,我假设我可以使用以下语法来获取迭代器对象:
Iterator<String> iterator = names.iterator();
但是,我在许多网站上看到了完全不同的语法,语法是 Iterator iterator = names.iterator();
这让我想到了一个问题 - 为什么我们看到
Iterator iterator = names.iterator();
用于
Iterator<String> iterator = names.iterator();?
是否因为向后兼容?我看到它的方式,在“迭代器”这个词之后应该有一个钻石符号,例如
Iterator<String> iterator = names.iterator();
提及的链接 - Declaring an iterator in Java
顺便问一下,Peter Lawrey对Declaring an iterator in Java问题的答案是否是我问题的答案?如果是的话,有人可以扩展他的答案吗?提前谢谢。
答案 0 :(得分:2)
因为Iterator<String>
允许
while (iterator.hasNext()) {
String item = iterator.next();
// use it
}
仅使用Iterator
会强迫我们投射:
while (iterator.hasNext()) {
String item = (String) iterator.next();
// use it
}
应该避免。
顺便说一句,请使用List<String> names = new LinkedList<>();
,而不是List<String> names = new LinkedList<String>();
。
答案 1 :(得分:2)
The accepted answer of the question referenced没有任何充分理由使用原始类型。
以下声明了一个通用List但是一个原始Iterator:
List<String> names = new LinkedList<>();
Iterator iterator = names.iterator();
因此,您必须将迭代器返回的元素强制转换为具体类型,例如:
Iterator iterator = names.iterator();
String myString = (String) iterator.next();
没有意义。使用通用类型,你也应该支持使用菱形算子(它只是语法糖):
List<String> names = new LinkedList<>();
Iterator<String> iterator = names.iterator();
仅使用原始类型,因为您没有任何其他选择:您使用Java 1.4或更早版本开发(今天不常见)。
答案 2 :(得分:1)
确实是因为向后兼容性,这是Java的强项(也是许多弱点的来源)。假设您有一些不了解泛型的Java 1.4.2代码,那么它将不再在Java 1.5或更高版本上运行。由于不再维护1.4分支,这将是一个问题。
在编译之后,由于向后兼容性,Java再次使用类型擦除,而Iterator<String>
只是Iterator
。但是,如果使用所谓的原始类型(Iterator
)而不是泛型类型(Iterator<String>
),则编译器将无法再维护类型安全性。这就是为什么你应该在现代Java代码中不惜一切代价避免使用原始类型。