我有一个关于泛型类型的问题。我已经编写了自己的迭代器类型,如果没有要迭代的内容,想返回一个空的迭代器。
以下代码有效,
@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中的转换有效,而最后一个却无效?在我的印象中,所有变体基本相同。
最佳答案
如果您希望它起作用,请使用以下语法:
return Collections.<MyType>emptyIterator();
这是将泛型赋予静态方法的方法。
如果调用
Collections.emptyIterator();
,它将返回与您的返回类型不兼容的Iterator<Object>
。您也不能强制转换,因为
Iterator<MyType>
不扩展Iterator<Object>
。