Java 6:不支持的@SuppressWarnings("rawtypes")警告

eol*_*old 41 java compiler-construction warnings raw-types suppress-warnings

我转移到一台新机器,它有最新的Sun Java编译器,并注意到现有Java 6代码中的一些警告.Eclipse IDE,建议我使用以下命令注释赋值:

@SuppressWarnings("rawtypes")
Run Code Online (Sandbox Code Playgroud)

例如:

class Foo<T> {
...
}
...
@SuppressWarnings("rawtypes")
Foo foo = new Foo();
Run Code Online (Sandbox Code Playgroud)

当我使用较旧的编译器(JDK 1.6.0_20)回到机器时,我注意到这个较旧的编译器现在警告抑制"rawtypes"警告,声称这种抑制不受支持并建议用@SuppressWarnings替换它( "未登记").此外,有些地方默认情况下,最新的编译器让我把"unchecked"和"rawtypes"都放在一起 - 用旧编译器编译代码再现相同的警告.

如何强制两者之间的向后/向前兼容性,以便编译器都不会产生警告?

Col*_*ert 43

您可以使用@SuppressWarnings("unchecked")eclipse编译器和javac都支持的.

但是请记住@SuppressWarnings编译器使用的注释可以有自己的值.JLS只强制编译器理解值"unchecked"和"deprecated"(暂时).

编译器供应商应记录它们支持的警告名称以及此注释类型.鼓励他们合作以确保相同的名称在多个编译器中工作.

如果您使用Helios,则需要设置一个特定选项以允许@SuppressWarnings("unchecked")代替@SuppressWarnings("rawtypes"),

如果无法使用新令牌更新代码,则suppressRawWhenUnchecked=true可以在启动Eclipse时设置系统属性.


资源:


编辑:这是现在不可用的knol文章,用作参考,最初由Alex Miller编写.

Java中的@SuppressWarnings注释

用于抑制各种警告的标准注释

SuppressWarnings注释在Java SE 5中作为标准注释添加.

定义

@SuppressWarnings注释在Java语言规范定义的节9.6.1.5.本节说明:

注释类型SuppressWarnings支持程序员控制Java编译器发出的警告.它包含一个元素,它是一个数组String.如果使用注释对程序声明进行批注@SuppressWarnings(value = {S1, ... , Sk}),则Java编译器不得报告由S1,...,Sk之一标识的任何警告,如果该警告是由于带注释的声明或其任何部分而生成的.

未经检查的警告由字符串" unchecked" 标识.

随后的部分@Deprecation还提到,这些警告可与被抑制@SuppressWarnings("deprecation").

有效的警告类型

规范中提到的唯一两个警告字符串是"未选中"和"弃用".但是,Sun JDK在编译器中使用了更大的字符串集.您可以通过执行以下内容来确定当前集:

javac -X
Run Code Online (Sandbox Code Playgroud)

这将显示(除其他外)-Xlint的有效设置.

例如,Sun JDK 1.5显示:

  • all - 禁止此代码中的所有警告
  • 弃用 - 禁止使用弃用代码的警告
  • unchecked - 禁止来自未经检查的调用或未经检查的强制转换的警告
  • fallthrough - 如果交换机没有找到有效的情况(并且没有默认值),则禁止警告
  • 路径 -
  • serial - 如果Serializable类没有定义serialVersionUID,则禁止警告
  • 最后 - 在一个finally内部返回抑制警告(这将忽略返回尝试)

Sun JDK 1.6补充说:

  • divzero - 如果检测到整数除以零则禁止警告
  • 覆盖
  • 没有

IDE和静态分析工具通常支持@SuppressWarnings的大量其他可能值.这些值对应于IDE执行的特定静态分析检查.

日食

Eclipse 3.3的Eclipse警告值记录在JDT文档中.

  • 全部 - 压制所有警告
  • 拳击 - 禁止相对于装箱/拆箱操作的警告
  • 施放 - 抑制与施法操作相关的警告
  • dep-ann - 禁止相对于已弃用的注释的警告
  • 弃用 - 禁止相对于弃用的警告
  • fallthrough - 禁止相对于switch语句中缺少中断的警告
  • 最后 - 抑制相对于不返回的finally块的警告
  • 隐藏 - 抑制相对于隐藏变量的本地人的警告
  • incomplete-switch - 禁止相对于switch语句中缺少条目的警告(枚举案例)
  • nls - 禁止相对于非nls字符串文字的警告
  • null - 禁止相对于null分析的警告
  • 限制 - 禁止使用不鼓励或禁止引用的警告
  • serial - 禁止相对于可序列化类缺少serialVersionUID字段的警告
  • static-access - 抑制与不正确的静态访问相关的警告
  • synthetic-access - 抑制与内部类的未优化访问相关的警告
  • unchecked - 禁止相对于未经检查的操作的警告
  • unqualified-field-access - 禁止相对于字段访问的警告不合格
  • unused - 禁止相对于未使用代码的警告

的IntelliJ

NetBeans的

例子

指定单个警告的示例:

@SuppressWarnings("unchecked")
public void methodWithScaryWarnings() {
    List rawList = new ArrayList();
    List<String> stringList = (List<String>)rawList;
}
Run Code Online (Sandbox Code Playgroud)

使用两个警告的示例:

@SuppressWarnings({"unchecked","deprecation"})
public void methodWithScaryWarnings() {
    callDeprecatedMethod();
}
Run Code Online (Sandbox Code Playgroud)