这是被起诉的代码:

import java.util.Iterator;

public class MyClass<T> implements Iterable<T> {

    private int n;
    private Object array[];

    public myClass( int size ){
        array = new Object[size];
        n=0;

    }

    @Override
    public Iterator<T> iterator(){
        return new MyClassIterator<T>(n,array); //Here's my error!
    }



    }
    class MyClassIterator<T> implements Iterator<T>{

    private int n;
    private T[] array;

    MyClassIterator( int n, T[] array ){

        this.n = n;
        this.array = array;

    }

    @Override
    public T next(){
        return array[n++];
    }

    @Override
    public boolean hasNext(){

        return n==array.length;
    }

}


此代码给我错误:


  错误:类型不兼容:Object []无法转换为T []
          返回新的myClassIterator(n,array);
    其中T是类型变量:
      T扩展在类myClass中声明的Object
  注意:一些消息已简化。用-Xdiags:verbose重新编译以获取完整输出
  1个错误


但是,在iterator()中创建myClassIterator对象的过程中删除了之后,错误消失了,代码可以正常工作了,现在我问为什么要指定通用类型给我这个错误?

起作用的“正确”代码是这样的:

@Override
public Iterator<T> iterator(){

    return new myClassIterator(n,array);

}

最佳答案

MyClassIterator<T>的构造函数声明为采用T的数组,但是您要传递Object的数组。由于您还使用T参数化了外部类,因此实际上看起来您希望array字段是T的数组

private T array[]


但是,只有将类传递给构造函数,您才能初始化数组,如下所示:

public myClass( int size, Class<T> clazz ){
    array = (T[]) Array.newInstance(clazz, size);
}

10-04 16:13