Java SE 7中不可恢复类型的变量 - 如何?

nec*_*cer 4 java generics variadic-functions

我的代码在Java SE 7中发出警告.如何在使用注释来抑制警告的情况下绕过它; 并按预期使用 varargs:

  import java.util.Iterator;

  public class UnionIterator < E > implements Iterator < E > {

  public static < E > Iterator < E > newInstance (Iterator < E > ... iterators) {
    return new UnionIterator < E >(iterators);
  }

  private Iterator < E > [] iterators;

  private UnionIterator (Iterator < E > ... iterators) {
    this.iterators = iterators;
  }

  @Override
  public boolean hasNext() {
    // TODO
    return false;
  }

  @Override
  public E next() {
    // TODO
    return null;
  }

  @Override
  public void remove() {
    // TODO
  }

}
Run Code Online (Sandbox Code Playgroud)

这是警告:

$ javac UnionIterator.java 
Note: UnionIterator.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
$ javac -Xlint:unchecked UnionIterator.java 
UnionIterator.java:5: warning: [unchecked] Possible heap pollution from parameterized vararg type Iterator<E>
  public static < E > Iterator < E > newInstance (Iterator < E > ... iterators) {
                                                                     ^
  where E is a type-variable:
    E extends Object declared in method <E>newInstance(Iterator<E>...)
UnionIterator.java:11: warning: [unchecked] Possible heap pollution from parameterized vararg type Iterator<E>
  private UnionIterator (Iterator < E > ... iterators) {
                                            ^
  where E is a type-variable:
    E extends Object declared in class UnionIterator
2 warnings
Run Code Online (Sandbox Code Playgroud)

Jef*_*rey 5

你不能.如果您使用的是Java 7,则可以使用@SafeVarargs工厂方法上的注释来抑制每次调用的警告newInstance.

  • +1 - 鼓励OP阅读本页 - http://docs.oracle.com/javase/tutorial/java/generics/non-reifiable-varargs-type.html - 其中详细说明了这一切. (3认同)