Java-本地类和泛型,为什么会出现编译器警告?

亚丁娜(Yardena):

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

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 ...才能使警告消失。

这是怎么回事?

亚丁娜(Yardena):

我现在确信这是一个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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么犯规JIT编译器(Java)的保存结果?

为什么Java编译器失去构造函数实例化轨道泛型类型的?

Java的泛型数组:为什么这个编译和这是什么意思?

如何提取从Java泛型类类满足编译器?

为什么Java编译器会为类文字提供“ rawtypes”警告?

为什么Java编译器不重写此代码?

为什么Java编译器复制最终会阻塞?

Java泛型-为什么返回超类实例会产生编译错误

Java泛型。为什么要编译?

Java泛型类型绑定。为什么不编译?

为什么将Scala随播对象编译为两个类(Java和.NET编译器)?

在Java中转换为泛型方法类型变量时出现编译器警告

Java泛型:这里的编译器有什么问题?(“没有唯一的最大实例”)

Java:泛型转换会产生警告,为什么?

为什么Java泛型的这种(错误)用法无法编译?

Java:为什么编译器在这里抱怨?

Java泛型通配符:为什么不编译?

为什么Java编译器不报告Intellij中多播表达式的未经检查的强制转换警告?

调用泛型方法java的编译器错误

为什么运算符<对于Java泛型有编译器错误?

保存ArrayLists时由泛型引起的Java编译器警告

泛型和Java警告

泛型和迭代器的Java编译器错误

Java泛型-编译器错误

Java:递归泛型编译器错误

为什么Java编译器抱怨StringBuffer

为什么这个java接口定义使用编译器接受的泛型?

为什么 Java 上的 instanceof 会出现编译错误?

为什么java编译器不抱怨“\ s”?