忽略 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,包括。蚂蚁.
我想将缺少的 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,包括。蚂蚁.