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

我搬到了一台具有最新Sun Java编译器的新机器,并注意到现有Java 6代码中的一些警告。Eclipse IDE 建议我用以下内容对赋值进行注释:

@SuppressWarnings("rawtypes")

例如:

class Foo<T> {
...
}
...
@SuppressWarnings("rawtypes")
Foo foo = new Foo();

当我使用较旧的编译器(JDK 1.6.0_20)移回机器时,我注意到这个较旧的编译器现在警告禁止“rawtypes”警告,声称不支持此抑制,并建议将其替换为@SuppressWarnings(“unchecked”)。此外,默认情况下,最新的编译器在某些地方让我同时放置“unchecked”和“rawtypes” - 使用较旧的编译器编译该代码会重现相同的警告。

如何强制在两者之间强制向后/向前兼容,以便两个编译器都不生成警告?


答案 1

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

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

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

如果使用 Helios,则需要将特定选项设置为允许,而不是 ,@SuppressWarnings("unchecked")@SuppressWarnings("rawtypes")

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


资源:


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

@SuppressWarnings Java 中的注释

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

SuppressWarnings 注释是作为 Java SE 5 中的标准注释添加的。

定义

@SuppressWarnings注释在 Java 语言规范 9.6.1.5 节中定义。本节指出:

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

未选中的警告由字符串 “” 标识。unchecked

后面的部分还提到,可以使用 来抑制这些警告。@Deprecation@SuppressWarnings("deprecation")

有效的警告类型

规范本身中提到的仅有的两个警告字符串是“未选中”和“弃用”。但是,Sun JDK 在编译器中使用了更大的字符串集。您可以通过执行以下操作来确定当前集:

javac -X

它将显示(除其他事项外)-Xlint 的有效设置。

例如,Sun JDK 1.5 显示:

  • all - 禁止显示此代码中的所有警告
  • 弃用 - 禁止使用已弃用代码的警告
  • 未选中 - 禁止显示来自未选中呼叫或未选中强制转换的警告
  • 回退 - 如果开关在未找到有效案例(且无默认值)的情况下失败,则禁止显示警告
  • 路径 -
  • 串行 - 如果可序列化类未定义串行版本UID,则禁止显示警告
  • 最后 - 在 finally 内禁止返回警告(这将忽略尝试返回)

Sun JDK 1.6还添加了:

  • divzero - 如果检测到整数除以零,则禁止显示警告
  • 重写
  • 没有

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

日蚀

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

  • 全部 - 禁止显示所有警告
  • 装箱 - 禁止显示与装箱/取消装箱操作相关的警告
  • 强制转换 - 抑制相对于强制转换操作的警告
  • dep-ann - 禁止显示与已弃用的注释相关的警告
  • 弃用 - 禁止显示与弃用相关的警告
  • 回退 - 禁止显示与 switch 语句中缺少断点相关的警告
  • 最后 - 相对于不返回的最终阻止,禁止显示警告
  • 隐藏 - 禁止显示相对于隐藏变量的局部变量的警告
  • 不完整开关 - 禁止显示与开关语句中缺少的条目相关的警告(枚举大小写)
  • nls - 禁止显示相对于非 nls 字符串文本的警告
  • 空 - 禁止显示相对于空分析的警告
  • 限制 - 禁止显示与使用不鼓励或禁止的引用相关的警告
  • 串行 - 禁止显示与可序列化类的缺少串行版本UID 字段相关的警告
  • 静态访问 - 禁止显示与不正确的静态访问相关的警告
  • 综合访问 - 禁止显示与来自内部类的未优化访问相关的警告
  • 未选中 - 禁止显示与未选中操作相关的警告
  • 不合格的字段访问 - 禁止显示与字段访问不合格的警告
  • 未使用 - 禁止显示与未使用代码相关的警告

IntelliJ

网豆

例子

指定单个警告的示例:

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

使用两个警告的示例:

@SuppressWarnings({"unchecked","deprecation"})
public void methodWithScaryWarnings() {
    callDeprecatedMethod();
}

答案 2

请注意,Eclipse 3.5 不理解原始类型,并标记了切换到未选中状态的警告。令人沮丧的是,Eclipse提出了原始类型注释,这会导致更多的问题而不是解决。他们应该坚持标准。


推荐