我的代码无法从E转换为E.我可以对E进行转换,但在此阶段似乎是多余的。我的数组已经声明为E-type。
import java.util.Iterator;
public class DataTypeDemo<E>
{
private E[] data = (E[]) new Object [10];
public MyIterator newIterator()
{
return new MyIterator();
}
private class MyIterator<E> implements Iterator<E>
{
private int location;
public boolean hasNext()
{
return location < data.length;
}
public E next()
{
return (data[location++]); // error here
}
public void remove()
{
throw new UnsupportedOperationException();
}
}
}
编译器,抛出此错误:
DataTypeDemo.java:23:不兼容的类型 发现:E 必需:E
答案 0 :(得分:19)
你的内部类型引入了它自己的类型变量:
private class MyIterator<E /* this is the problem*/> implements Iterator<E>
从而覆盖外部类型变量
将您的类型声明更改为:
private class MyIterator implements Iterator<E>
<强>参考:强>
答案 1 :(得分:5)
问题的根源是你的内部类。 对于编译器,不能保证两个E的类型相同。
import java.util.Iterator;
import java.util.ArrayList;
public class DataTypeDemo<E>
{
private ArrayList<E> data = new ArrayList<E>(10);
private class MyIterator implements Iterator<E>
{
private int location;
public boolean hasNext()
{
return location < data.size();
}
public E next()
{
return data.get(location++);
}
public void remove()
{
throw new UnsupportedOperationException();
}
}
}
虽然一旦你意识到这个问题,请随意实施自己的解决方案;)
快乐的黑客攻击。
答案 2 :(得分:5)
那是因为你已经为内部类MyIterator
提供了自己的类型参数E
。请注意,E
是与封闭类的E
不同的类型参数(您已将它们命名为E
,但它们是两个不同的类型参数。)
只需省略内部类的类型参数:
private class MyIterator implements Iterator<E> {
答案 3 :(得分:4)
我认为问题在于您的嵌套迭代器类型被定义为通用类,也通过名为E的无关类型进行参数化。要解决此问题,请更改
private class MyIterator<E> implements Iterator<E>
要
private class MyIterator implements Iterator<E>
这第一个声明表明你的类型的迭代器可以通过任何类型进行参数化,而不仅仅是外部容器的类型。它还引入了一个名为E的新类型变量,它与外部声明中的E分开。第二个定义说,对于任何容器类型,都有一个迭代器类型,它对于外部类型不是通用的。这可能就是你的意图。