在Java中调用迭代器方法时使用菱形表示法语法

时间:2018-04-22 18:41:56

标签: java

'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问题的答案是否是我问题的答案?如果是的话,有人可以扩展他的答案吗?提前谢谢。

3 个答案:

答案 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代码中不惜一切代价避免使用原始类型。