一些Java 7警告 - 如何删除它们

Old*_*eon 6 java netbeans compiler-warnings

我终于试图摆脱Java 7所产生的所有新编译器警告.我这两个人离开了,我无法理解.有没有办法摆脱它们而不压制它们?

构造一般类型的对象数组(我可以在数组中创建一个?):

  static final int N = 10;
//warning: [unchecked] unchecked conversion
  static final Set<Widget>[] queued = new ConcurrentSkipListSet[N];
//required: Set<Widget>[]
//found:    ConcurrentSkipListSet[]
Run Code Online (Sandbox Code Playgroud)

通用varargs(似乎几乎发生在我接受泛型类型的varargs的地方):

class Foo<T> {
//warning: [unchecked] Possible heap pollution from parameterized vararg type T
  public void add(T... entries) {
//where T is a type-variable:
//T extends Object declared in class Foo
Run Code Online (Sandbox Code Playgroud)

顺便说一句:我已经:

  // Add many entries to the list.
  public void add(List<T> entries) {
    // ...
  }

  // Add a number of entries.
  public void add(T... entries) {
    // Make a list of them.
    add(Arrays.<T>asList(entries));
  }
Run Code Online (Sandbox Code Playgroud)

Ted*_*opp 7

对于第一个:

static final Set<Widget>[] queued = new ConcurrentSkipListSet<>[N];
Run Code Online (Sandbox Code Playgroud)

在Java 7之前,它必须是:

static final Set<Widget>[] queued = new ConcurrentSkipListSet<Widget>[N];
Run Code Online (Sandbox Code Playgroud)

但是,您可能最好将此声明为ArrayList<Set<Widget>>.通常,混合数组和泛型在Java中有点困难.

static final List<Set<Widget>> queued = new ArrayList<>();
// or new ArrayList<Set<Widget>>();
Run Code Online (Sandbox Code Playgroud)

关于第二个,请看这个帖子.虽然你可以压制消息,但它实际上警告了真正的危险.该线程的底线是,安全的做法是将您的方法签名(以及相应的调用)更改为:

class Foo<T> {
    public void add(List<T> entries) {
        . . .
Run Code Online (Sandbox Code Playgroud)

问题基本上与第一个问题相同:您不应该创建泛型数组.


Zho*_*gYu 1

通用数组创建:

static final ConcurrentSkipListSet<Widget>[] queued = newArray(N);
// note: declare the most specific type for private objects


@SafeVarargs
static <E> E[] newArray(int length, E... array)
{
    return Arrays.copyOf(array, length);
}
Run Code Online (Sandbox Code Playgroud)

它是如何工作的 - 由于newArray是一个 vararg 方法,E[] array必须传入一个参数,因此方法体可以访问E[]. 这在理论上是正确的,如果没有擦除,它将在运行时完全类型安全。通过擦除,我们只在运行时擦除了类型E[],这很好,我们也返回相同的擦除类型。