如何调用泛型静态方法的编译器使用的遗传信息?

时间:2014-04-28 12:52:30

标签: java generics

我对泛型类型有疑问。我编写了自己的迭代器类型,如果没有任何迭代可以返回一个空的迭代器。

以下代码有效,

@Override
public Iterator<MyType> iterator() {
    final Iterator<MyType> iter = Collections.emptyIterator();
    return count > 0 ? new MyIterator() : iter;
}

然而,如果用这样的一行写成它就不起作用:

@Override
public Iterator<MyType> iterator() {
    return count > 0 ? new MyIterator() : Collections.emptyIterator();
}

我收到错误并且必须转换类型来解决它:

@Override
public Iterator<MyType> iterator() {
    return (Iterator<MyType>)(count > 0 ? new MyIterator() : Collections.emptyIterator());
}

这个演员然后导致一个未经检查的警告,在第一个例子中没有警告。

当我将演员阵容移到内部时,它也不起作用:

@Override
public Iterator<MyType> iterator() {
    return count > 0 ? new EdgeIterator() : (Iterator<MyType>) Collections.emptyIterator();
}

我现在的问题是:为什么编译器不能在后面的例子中确定类型是正确的,而是在第一个例子中。为什么变体3中的强制转换有效,但最后一个变量无效?这些变体在我的印象中基本相同。

1 个答案:

答案 0 :(得分:1)

如果您希望它起作用,请使用以下语法:

 return Collections.<MyType>emptyIterator();

这是如何将泛型赋予静态方法。

如果您致电Collections.emptyIterator();,则会返回与您的返回类型不兼容的Iterator<Object>

您也无法投票,因为Iterator<MyType> 未延伸 Iterator<Object>