Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么for(T:this)有效?它意味着什么? 公共抽象类MyAbstractSet实现Iterable{ ... //一些代码 ... 方法补充元素(T){ 对于(T:这个){ //为什么这样做???? } } }_Java_For Loop_Generics_Java 8_Iteration - Fatal编程技术网

Java 为什么for(T:this)有效?它意味着什么? 公共抽象类MyAbstractSet实现Iterable{ ... //一些代码 ... 方法补充元素(T){ 对于(T:这个){ //为什么这样做???? } } }

Java 为什么for(T:this)有效?它意味着什么? 公共抽象类MyAbstractSet实现Iterable{ ... //一些代码 ... 方法补充元素(T){ 对于(T:这个){ //为什么这样做???? } } },java,for-loop,generics,java-8,iteration,Java,For Loop,Generics,Java 8,Iteration,我刚刚完成了一个关于集合和在Java中实现Iterable和Iterator类的家庭作业。作业的全部目的是理解泛型和集合,我想我现在已经掌握了 然而,在实现上述MyAbstractSet类时,我错误地为(T:this)键入了,这让我有些困惑,因为编译器在编译它时没有遇到任何问题 我试图弄明白这意味着什么,但还不清楚。就像添加泛型类型使类成为某种列表一样,for-each循环会迭代该列表 有人能给我解释一下为什么会这样做,以及它的作用是什么吗?也许还可以在Java文档中发布一个链接来解释这一点?简

我刚刚完成了一个关于集合和在Java中实现
Iterable
Iterator
类的家庭作业。作业的全部目的是理解泛型和集合,我想我现在已经掌握了

然而,在实现上述
MyAbstractSet
类时,我错误地为(T:this)键入了
,这让我有些困惑,因为编译器在编译它时没有遇到任何问题

我试图弄明白这意味着什么,但还不清楚。就像添加泛型类型
使类成为某种列表一样,for-each循环会迭代该列表


有人能给我解释一下为什么会这样做,以及它的作用是什么吗?也许还可以在Java文档中发布一个链接来解释这一点?

简单地说,它是以下内容的组合:

  • 一个增强的for循环,我敢打赌你一定知道:

    public abstract class MyAbstractSet<T> implements Iterable<T> { 
        ...
        // some code
        ...
        method addElement(T t){
            for (T t : this) {
               //why does this work????
            }
        }
    }
    
    List listOfStrings=。。。
    for(字符串:ListOfstring)
    
  • T
    表示泛型类型<代码>列表
就是一个很好的例子

  • 引用调用方法的类的实例。由于
    实现了
    Iterable
    ,因此可以在增强循环中使用它

  • 因此,
    for(T:this)
    是通过访问的所有元素的类的同一实例的增强循环。

    Java语言规范,一节说:

    表达式的类型必须是原始类型
    Iterable
    的子类型或数组类型(),否则会发生编译时错误

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

    除了
    iter
    是一个隐藏变量外,您的循环将编译为以下内容:

    List<String> listOfStrings = ...
    for (String string: listOfStrings)
    
    for(迭代器iter=this.Iterator();iter.hasNext();){
    T=iter.next();
    ...
    }
    

    请参阅上面的JLS链接,以获取编译它的完整说明。

    因为
    是一个
    可编辑的
    for (Iterator<T> iter = this.iterator(); iter.hasNext(); ) {
        T t = iter.next();
        ...
    }