忽略 Javac 中的 Varargs 警告

Ignore Varargs Warnings In Javac

我想将缺少的 serialversionUID 警告升级为错误,并在它出现在 javac 时使我的构建失败。

我已将以下内容添加到我的 ant 任务中:

  <compilerarg value="-Xlint:serial"/>
  <compilerarg value="-Werror"/>

但是,构建也失败并出现可变参数警告:

non-varargs call of varargs method with inexact argument type for last parameter;
cast to java.lang.Object for a varargs call
cast to java.lang.Object[] for a non-varargs call and to suppress this warning

我尝试将 javac 任务更改为

  <compilerarg value="-Xlint:-varargs"/>
  <compilerarg value="-Xlint:serial"/>
  <compilerarg value="-Werror"/>

但是,这没有什么区别。如何让编译器忽略这些警告并仅在 serialversionUID 上失败?

我正在使用 Ant 1.9.4 并尝试使用 Javac 1.6u37、1.7u79 和 1.8u92

示例class:

package com.whosebug.compiler;

import java.io.Serializable;

public class Main implements Serializable {

    public static void foo(Object... args) {
        System.out.println("Test foo");
    }

    public static void main(String[] args) {
        // is args supposed to be an array of objects
        // or the only element in an array?
        foo(args);
    }
}

您的警告似乎与 -Xlint:varargs 选项无关

根据 javac reference -Xlint 的可变参数选项:

Warns about unsafe usages of variable arguments (varargs) methods, in particular, those that contain non-reifiable arguments

文档说下面的代码:

public class ArrayBuilder {
  public static <T> void addToList (List<T> listArg, T... elements) {
    for (T x : elements) {
      listArg.add(x);
    }
  }
}

应该产生警告:

warning: [varargs] Possible heap pollution from parameterized vararg type T

我得到的实际警告(使用 javac 1.8.0_65)是:

warning: [unchecked] Possible heap pollution from parameterized vararg type T

(即 unchecked 而不是 varargs

您收到的警告可能是由如下代码引起的:

public static void foo(Object... args) {...}

public static void main(String[] args) {
    // is args supposed to be an array of objects 
    // or the only element in an array?
    foo(args);
}

该警告仅使用 -Xlint:none 选项就消失了,但是 -Xlint:serial 什么也没做。所以看来你想要的是不可能的。

我知道问题是关于 javac,但我还是要提一下 ecj 可以配置以满足您的要求:只需在命令行中说 -err:serial

使用这个选项这个源文件

public class Serial implements java.io.Serializable {}

将触发此编译器输出

----------
1. ERROR in /tmp/Serial.java (at line 1)
        public class Serial implements java.io.Serializable {}
                     ^^^^^^
The serializable class Serial does not declare a static final serialVersionUID field of type long
----------
1 problem (1 error)

其他警告不受该选项影响。特别是,您可以通过添加 -warn:-varargsCast 来完全抑制可变参数警告。这不是必需的,因为警告永远不会让您的构建失败。但是如果你真的不想看到这个,即使是警告,完整的命令行看起来像这样:

ecj -err:serial -warn:-varargsCast Main.java 

请参阅 JDT FAQ 在自动构建中使用 ecj,包括。蚂蚁.