【问题标题】:Java: Type mismatch with iterator of generic classJava:类型与泛型类的迭代器不匹配
【发布时间】:2013-06-07 16:27:00
【问题描述】:

我想为一个运行良好的泛型类创建一个迭代器。我认为迭代器会尝试使用泛型类的 TypeParameter 进行迭代,但显然情况并非如此,因为 Eclipse 告诉我需要一个 Object。

如果有人知道我做错了什么,我会很高兴。

public class GenericClass<T extends OtherClass> implements Comparable, Iterable
{
    private ArrayList<T> list = new ArrayList<T>();
    [...]
    @Override
    public Iterator<T> iterator()
    {
    Iterator<T> iter = list .iterator();
    return iter;
}
    [...]
}



public class Main
{
public static void main(String[] args)
{
    GenericClass<InstanceOfOtherClass> gen = new GenericClass<InstanceOfOtherClass>("Aius");

    for(InstanceOfOtherClass listElement : gen) // This is the problem line; gen is underlined and listElement is expected to be an Object
    {
        System.out.println(listElement.getName());
    }

}

}

【问题讨论】:

  • 阅读编译器警告

标签: java generics iterator


【解决方案1】:
implements Comparable, Iterable

您需要指定基本接口的通用参数。
否则,您将非泛型实现Iterable,类型参数将变为Object

【讨论】:

  • "否则,您将实现 Iterable。"不,他们不会。他们将实施Iterable(和Comparable)。 IterableIterable&lt;Object&gt; 不是一回事
【解决方案2】:

如果你想让你的类像GenericClass&lt;T extends OtherClass&gt; 一样通用,那么你应该实现Comparable&lt;T&gt;Iterable&lt;T&gt;,这两种情况下的TGenericClass 声明的T 相同。

这样当你做一个泛型类型实例化如下 -

 GenericClass<InstanceOfOtherClass> //...

效果是它正在实现Comparable&lt;InstanceOfOtherClass&gt;Iterable&lt;InstanceOfOtherClass&gt;,这使得方法签名匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-20
    • 2014-09-22
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多