为什么 for(T t : this) 起作用,它的意思是什么?

3
public abstract class MyAbstractSet<T> implements Iterable<T> { 
    ...
    // some code
    ...
    method addElement(T t){
        for (T t : this) {
           //why does this work????
        }
    }
}

我刚刚完成了一篇关于集合和在Java中实现Iterable和Iterator类的作业。整个作业的目的是理解泛型和集合,我觉得我现在有点掌握了。
然而,在实现上面的MyAbstractSet类时,我因为打错了字而输入了for(T t: this),这有些让我困惑,因为编译器没有任何问题。
我试图找出这意味着什么,但还没有清晰的答案。比如说,添加泛型类型会使一个类成为某种列表吗,从而使用for-each循环进行迭代?
能否有人解释一下为什么这样可以工作以及它的作用是什么,同时也可以发一篇在Java文档中解释这点的链接吗?

5
因为this是一个可迭代对象。 - f1sh
2个回答

9
简单说,它是这些的组合:
  • An enhanced for loop, I bet you know it:

    List<String> listOfStrings = ...
    for (String string: listOfStrings)
    
  • T stands for a generic type. List<T> is a good example.

  • this refers to the instance of a class where is the method called. Since this implements Iterable<T>, it might be used in the enhanced loop.
因此,for (T t : this) 是通过 forEach(Consumer<? super T> action) 访问的所有元素的类实例的增强循环。请注意保留HTML标记。

3

Java语言规范,第14.14.2节 增强型for语句 表示:

表达式 的类型必须是原始类型 Iterable 或者数组类型(§10.1),否则会编译错误。

由于您的 this 对象实现了 Iterable 接口,因此循环是有效的,并且将通过调用 iterator() 方法迭代您的集合元素。

以下是您的循环编译后的代码,但是 iter 是一个隐藏变量:

for (Iterator<T> iter = this.iterator(); iter.hasNext(); ) {
    T t = iter.next();
    ...
}

请参阅上面的JLS链接,了解其完整编译描述。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接