Java - 本地类和泛型,为什么编译器警告? [英] Java - local class and generics, why compiler warning?
问题描述
命名为地方课程非常很少使用,通常本地类是匿名的。有人知道为什么下面的代码会生成编译器警告吗?
Named local classes are very rarely used, usually local classes are anonymous. Does anybody know why the code below generates a compiler warning?
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();
}
}
警告在 new InIterator()
,它表示:
The warning is in new InIterator()
and it says
[unchecked] unchecked conversion
found : InIterator
required: java.util.Iterator<E>
如果这个类不变,是匿名的,或者它是一个成员,警告就会发生远。但是,作为命名的本地类,它需要声明 class InIterator< E>实现......
,警告消失。
If the class, unchanged, is made anonymous, or if it is made a member, the warning goes away. However, as a named local class, it requires a declaration class InIterator<E> implements ...
for the warning to go away.
发生了什么事?
推荐答案
我现在确信这是一个javac错误。上面给InIterator添加了一个通用参数的解决方案隐藏或替换E没有帮助,因为它们阻止迭代器执行某些有用的操作,例如返回E - Stuff的E类型元素。
I am now convinced that it's a javac bug. The solutions above that add a generic parameter to InIterator that either hides or replaces E aren't helpful, because they preclude the iterator from doing something useful, like returning an element of type E - Stuff's E.
然而,这个编译没有警告(感谢Jorn的提示):
However this compiles with no warnings (thanks Jorn for the hint):
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>();
}
}
绝对是一个bug。
这篇关于Java - 本地类和泛型,为什么编译器警告?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!