我对泛型类型有疑问。我编写了自己的迭代器类型,如果没有任何迭代可以返回一个空的迭代器。
以下代码有效,
@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中的强制转换有效,但最后一个变量无效?这些变体在我的印象中基本相同。
答案 0 :(得分:1)
如果您希望它起作用,请使用以下语法:
return Collections.<MyType>emptyIterator();
这是如何将泛型赋予静态方法。
如果您致电Collections.emptyIterator();
,则会返回与您的返回类型不兼容的Iterator<Object>
。
您也无法投票,因为Iterator<MyType>
未延伸 Iterator<Object>
。