Java - 本地类和泛型,为什么编译器警告? [英] Java - local class and generics, why compiler warning?

查看:153
本文介绍了Java - 本地类和泛型,为什么编译器警告?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

命名为地方课程非常很少使用,通常本地类是匿名的。有人知道为什么下面的代码会生成编译器警告吗?

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆