46

我搬到了一台装有最新 Sun 的 Java 编译器的新机器上,并注意到现有 Java 6 代码中的一些警告。Eclipse IDE 建议我用:

@SuppressWarnings("rawtypes")

例如:

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

当我回到使用旧编译器(JDK 1.6.0_20)的机器时,我注意到这个旧编译器现在警告“原始类型”警告的抑制,声称这种抑制不受支持并建议用 @SuppressWarnings 替换它(“未选中”)。此外,在某些地方,默认情况下,最新的编译器让我同时放置“未检查”和“原始类型”——用旧编译器编译该代码会重现相同的警告。

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

4

2 回答 2

49

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

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

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

如果您使用 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. 如果程序声明使用 annotation 进行注释@SuppressWarnings(value = {S1, ... , Sk}),则 Java 编译器不得报告由 S1、...、Sk 之一标识的任何警告,如果该警告是由于带注释的声明或其任何部分而生成的。

未经检查的警告由字符串“ unchecked”标识。

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

有效的警告类型

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

javac -X

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

例如,Sun JDK 1.5 显示:

  • all - 禁止此代码中的所有警告
  • deprecation - 禁止使用已弃用代码的警告
  • unchecked - 禁止来自未经检查的调用或未经检查的演员的警告
  • fallthrough - 如果开关在没有找到有效案例的情况下失败(并且没有默认值),则抑制警告
  • 小路 -
  • serial - 如果 Serializable 类未定义 serialVersionUID,则禁止显示警告
  • finally - 禁止在 finally 中返回警告(这将忽略尝试返回)

Sun JDK 1.6 增加了:

  • 投掷
  • divzero - 如果检测到整数除以零,则抑制警告
  • 空的
  • 覆盖
  • 没有任何

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

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

  • all - 禁止所有警告
  • 装箱 - 抑制与装箱/拆箱操作相关的警告
  • cast - 抑制与强制转换操作相关的警告
  • dep-ann - 抑制与弃用注释相关的警告
  • 弃用 - 抑制与弃用相关的警告
  • fallthrough - 抑制与 switch 语句中缺少中断相关的警告
  • finally - 抑制与 finally 块相关的不返回的警告
  • 隐藏 - 抑制与隐藏变量的本地人相关的警告
  • 不完整开关 - 抑制与 switch 语句中缺失条目相关的警告(枚举案例)
  • nls - 抑制与非 nls 字符串文字相关的警告
  • null - 抑制与 null 分析相关的警告
  • 限制 - 抑制与使用不鼓励或禁止引用相关的警告
  • serial - 抑制与可序列化类的缺失 serialVersionUID 字段相关的警告
  • static-access - 抑制与不正确的静态访问相关的警告
  • 合成访问 - 抑制与来自内部类的未优化访问相关的警告
  • unchecked - 抑制与未经检查的操作相关的警告
  • unqualified-field-access - 抑制与不合格字段访问相关的警告
  • 未使用 - 抑制与未使用代码相关的警告

智能

NetBeans

例子

指定单个警告的示例:

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

使用两个警告的示例:

@SuppressWarnings({"unchecked","deprecation"})
public void methodWithScaryWarnings() {
    callDeprecatedMethod();
}
于 2010-09-05T16:32:55.130 回答
4

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

于 2011-02-07T13:07:00.057 回答