这是被起诉的代码:
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);
}