命名本地类很少使用,通常本地类是匿名的。有人知道为什么下面的代码会生成编译器警告吗?
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()
,上面写着
[unchecked] unchecked conversion
found : InIterator
required: java.util.Iterator<E>
如果将未更改的类设为匿名,或者将其设为成员,则警告消失。但是,作为命名的本地类,它需要声明class InIterator<E> implements ...
才能使警告消失。
这是怎么回事?
我现在确信这是一个javac错误。上面为InIterator添加通用参数以隐藏或替换E的解决方案没有帮助,因为它们使迭代器无法执行有用的操作,例如返回E类型的东西-Stuff'sE。
但是,编译时没有警告(感谢乔恩的提示):
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>();
}
}
绝对是一个错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句