在Javac中忽略Varargs警告

时间:2016-07-04 21:49:23

标签: ant javac

我想将丢失的serialversionUID警告升级为错误,并在javac中发生时使构建失败。

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

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

但是,构建也因varargs警告而失败:

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

示例类:

package com.stackoverflow.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);
    }
}

2 个答案:

答案 0 :(得分:2)

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

无关

根据javac reference -Xlint的varargs选项:

  

警告变量参数(varargs)方法的不安全用法,特别是那些包含不可再生参数的方法

文档说明了以下代码:

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

(即未选中而非 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无效。所以看起来你想要的东西是不可能的。

答案 1 :(得分:1)

我知道问题是关于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来完成抑制varargs警告。这不是必需的,因为警告永远不会让您的构建失败。但如果您真的不想将此视为警告,那么完整的命令行将如下所示:

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

有关在自动构建中使用ecj的信息,请参阅JDT FAQ。蚂蚁。