Java泛型,无法从E转换为E

时间:2011-02-06 21:25:36

标签: java generics

我的代码无法从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

4 个答案:

答案 0 :(得分:19)

你的内部类型引入了它自己的类型变量:

private class MyIterator<E /* this is the problem*/> implements Iterator<E>

从而覆盖外部类型变量

将您的类型声明更改为:

private class MyIterator implements Iterator<E>

<强>参考:

  • Generics FAQ(虽然字面上没有提到这个问题,但这个FAQ条目暗示了这一点)

答案 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分开。第二个定义说,对于任何容器类型,都有一个迭代器类型,它对于外部类型不是通用的。这可能就是你的意图。