我有一个关于泛型类型的问题。我已经编写了自己的迭代器类型,如果没有要迭代的内容,想返回一个空的迭代器。

以下代码有效,

@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>

09-11 18:56
查看更多