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

2022-09-03 09:45:45

我的代码无法从 E 转换为 E。我可以对类型E进行强制转换,但在这个阶段似乎是多余的。我的数组已声明为 E 类型。

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();
    }
}
}

编译器,抛出以下错误:

数据类型Demo.java:23:发现不兼容的类型:需要 E:E


答案 1

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

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

从而覆盖外部类类型变量

将类型声明更改为:

private class MyIterator implements Iterator<E>

参考:

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

答案 2

你问题的根源在于你的一个内在类。对于编译器,不能保证两个 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();
            }
        }
    }

虽然一旦你意识到这个问题,请随时实施自己的解决方案,;)
快乐黑客攻击。


推荐