Java 6:不受支持的@SuppressWarnings(“rawtypes”)警告

Java 6:不受支持的@SuppressWarnings(“rawtypes”)警告,java,compiler-construction,warnings,suppress-warnings,raw-types,Java,Compiler Construction,Warnings,Suppress Warnings,Raw Types,我转向一台新机器,它有最新的Sun Java编译器,并注意到现有Java 6代码中存在一些警告。EclipseIDE建议我用以下内容注释分配: @SuppressWarnings("rawtypes") 例如: class Foo<T> { ... } ... @SuppressWarnings("rawtypes") Foo foo = new Foo(); class-Foo{ ... } ... @抑制警告(“原始类型”) Foo-Foo=新的Foo(); 当我回到使用旧

我转向一台新机器,它有最新的Sun Java编译器,并注意到现有Java 6代码中存在一些警告。EclipseIDE建议我用以下内容注释分配:

@SuppressWarnings("rawtypes")
例如:

class Foo<T> {
...
}
...
@SuppressWarnings("rawtypes")
Foo foo = new Foo();
class-Foo{
...
}
...
@抑制警告(“原始类型”)
Foo-Foo=新的Foo();
当我回到使用旧编译器(JDK 1.6.020)的机器上时,我注意到这个旧编译器现在警告禁止“rawtypes”警告,声称不支持这种禁止,并建议用@SuppressWarnings(“未选中”)替换它。此外,在某些地方,默认情况下,最新的编译器会让我同时放置“unchecked”和“rawtypes”——使用旧编译器编译代码时会重复相同的警告


如何在这两个编译器之间实现向后/向前兼容性,以使它们都不会产生警告?

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

但是请记住,
@SuppressWarnings
注释由编译器使用,它可以有自己的值。JLS只强制编译器理解值“unchecked”和“deprecated”(目前)

编译器供应商应将其支持的警告名称与此注释类型一起记录下来。鼓励他们合作,以确保相同的名称在多个编译器中工作

如果使用Helios,则需要设置一个特定选项以允许
@SuppressWarnings(“未选中”)
而不是
@SuppressWarnings(“rawtypes”)

如果无法使用新标记更新代码,则可以在启动Eclipse时设置
suppressRawWhenChecked=true
系统属性


资源:

  • (Java编译器,@SuppressWarnings注释的新“rawtypes”标记)

编辑:这是现在不可用的knol文章,作为参考,最初由作者撰写

@Java中的SuppressWarnings注释 用于抑制各种警告的标准注释

SuppressWarnings注释作为标准注释添加到JavaSE5中

定义 注释在Java语言规范中定义。本节规定:

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

未检查的警告由字符串“
Unchecked
”标识

随后的
@Deprecation
还提到可以使用
@SuppressWarnings(“Deprecation”)
来抑制这些警告

有效的警告类型 规范中提到的仅有两个警告字符串是“unchecked”和“deprecation”。但是,Sun JDK在编译器中使用了更大的字符串集。您可以通过执行以下命令来确定当前设置:

javac -X
这将向您显示-Xlint的有效设置

例如,Sun JDK 1.5显示:

  • 全部-抑制此代码中的所有警告
  • 弃用-禁止使用弃用代码发出警告
  • 取消选中-取消选中调用或未选中强制转换的警告
  • 故障排除-如果开关在未找到有效案例(且无默认情况)的情况下故障排除,则抑制警告
  • 路径-
  • serial-如果可序列化类未定义SerialVersionId,则禁止显示警告
  • finally-在finally中抑制来自return的警告(这将通过try忽略return)
Sun JDK 1.6增加了:

  • 铸造
  • divzero-如果检测到整数除以零,则抑制警告
  • 空的
  • 覆盖
  • 没有
IDE和静态分析工具通常支持@SuppressWarnings的大量其他可能值。这些值对应于IDE执行的特定静态分析检查

日食 Eclipse3.3的Eclipse警告值为

  • 全部-抑制所有警告
  • 装箱-抑制与装箱/取消装箱操作相关的警告
  • 强制转换-抑制与强制转换操作相关的警告
  • dep ann-抑制与不推荐的批注相关的警告
  • 弃用-禁止显示与弃用相关的警告
  • 故障排除-抑制与switch语句中缺少中断相关的警告
  • finally-抑制与finally块相关的不返回的警告
  • 隐藏-抑制相对于隐藏变量的局部变量的警告
  • 不完整的切换-抑制与switch语句中缺少项相关的警告(枚举情况)
  • nls-抑制与非nls字符串文字相关的警告
  • null-抑制与null分析相关的警告
  • 限制-抑制与不鼓励或禁止引用的使用相关的警告
  • serial-抑制与可序列化类缺少SerialVersionId字段相关的警告
  • 静态访问-抑制与不正确的静态访问相关的警告
  • 合成访问-抑制与来自内部类的未优化访问相关的警告
  • 未选中-抑制与未选中操作相关的警告
  • 非限定字段访问-抑制与字段访问相关的警告
    @SuppressWarnings("unchecked")
    public void methodWithScaryWarnings() {
        List rawList = new ArrayList();
        List<String> stringList = (List<String>)rawList;
    }
    
    @SuppressWarnings({"unchecked","deprecation"})
    public void methodWithScaryWarnings() {
        callDeprecatedMethod();
    }