Yar*_*ena 5 java generics inner-classes
很少使用命名的本地类,通常本地类是匿名的.有谁知道为什么下面的代码生成编译器警告?
public class Stuff<E> {
Iterator<E> foo() {
class InIterator implements Iterator<E> {
@Override public boolean hasNext() { return false; }
@Override public E next() { return null; }
@Override public void remove() { }
}
return new InIterator();
}
}
Run Code Online (Sandbox Code Playgroud)
警告就在new InIterator(),它说
[unchecked] unchecked conversion
found : InIterator
required: java.util.Iterator<E>
Run Code Online (Sandbox Code Playgroud)
如果该类不变,是匿名的,或者如果它成为成员,则警告消失.但是,作为一个命名的本地类,它需要声明class InIterator<E> implements ...警告消失.
这是怎么回事?
我现在确信这是一个 javac bug。上面的解决方案向 InIterator 添加一个隐藏或替换 E 的泛型参数并没有什么帮助,因为它们阻止迭代器执行一些有用的操作,例如返回 E 类型的元素 - Stuff 的 E。
然而,编译时没有任何警告(感谢 Jorn 的提示):
public class Stuff<E> {
E bar;
Iterator<E> foo() {
class InIterator<Z> implements Iterator<E> {
@Override public boolean hasNext() { return false; }
@Override public E next() { return bar; }
@Override public void remove() { }
}
return new InIterator<Void>();
}
}
Run Code Online (Sandbox Code Playgroud)
绝对是一个错误。