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

@SuppressWarnings("rawtypes")

例如:

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

当我带着较旧的编译器(JDK 1.6.0_20)返回机器时,我注意到该较旧的编译器现在警告了抑制“ Rawtypes”警告,声称这种抑制是不支持的,并建议用@suppresswarnings将其更换为@suppresswarnings (“未选中”)。另外,默认情况下,最新编译器的一些地方使我同时将“未选中”和“ Rawtypes”放置 - 与较旧的编译器一起编译该代码会复制相同的警告。

我如何在两者之间执行向后/向前的兼容性,以使任何编译器都产生警告?

有帮助吗?

解决方案

您可以使用 @SuppressWarnings("unchecked") Eclipse编译器和Javac都支持。

但是记住 @SuppressWarnings 您的编译器使用注释,该编译器可以具有自己的值。 JLS仅迫使编译器理解“未选中”和“弃用”的值(目前)。

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

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

如果无法使用新令牌更新代码, suppressRawWhenUnchecked=true 开始日食时可以设置系统属性。


资源 :


编辑:这是现在不可用的knol文章,用作参考,最初由 亚历克斯·米勒(Alex Miller).

@suppresswarnings在Java中注释

抑制各种警告的标准注释

在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

这将向您展示(除其他事项)-XLINT的有效设置。

例如,Sun JDK 1.5显示:

  • 所有 - 抑制此代码中的所有警告
  • 弃用 - 抑制使用不弃用代码的警告
  • 不受控制 - 抑制未选中的电话或不受控制的演员的警告
  • 秋天 - 抑制警告,如果开关掉落而没有找到有效案例(没有默认)
  • 小路 -
  • 串行 - 抑制警告,如果可序列化类未定义串行verionuid
  • 最后 - 抑制最终返回的警告(这将忽略尝试的回报)

和Sun JDK 1.6添加:

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

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

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

  • 所有 - 压制所有警告
  • 拳击 - 抑制相对于拳击/拆箱操作的警告
  • 演员 - 抑制相对于演员行动的警告
  • dep -ann-抑制相对于弃用注释的警告
  • 折旧 - 抑制相对于贬值的警告
  • 秋天 - 在交换机语句中相对于缺少断裂的警告抑制警告
  • 最后 - 抑制相对于最终阻止的警告,该警告不会返回
  • 隐藏 - 抑制相对于隐藏变量的当地人的警告
  • 不完整的开关 - 在开关语句(枚举案例)中相对于缺少条目的警告抑制警告(枚举案例)
  • NLS-抑制相对于非NLS字符串文字的警告
  • 无效 - 抑制相对于无效分析的警告
  • 限制 - 抑制与使用或禁止参考的使用相对于使用的警告
  • 串行 - 抑制相对于缺少序列化类的缺少串行的警告。
  • 静态访问 - 抑制相对于不正确静态访问的警告
  • 综合 - 访问 - 抑制相对于内部类别不优化访问的警告
  • 不受控制 - 抑制相对于未检查操作的警告
  • 不合格的场上访问 - 抑制与现场访问无限制的警告
  • 未使用 - 抑制相对于未使用的代码的警告

Intellij

Netbeans

例子

指定单个警告的一个示例:

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

使用两个警告的一个例子:

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

其他提示

请注意,Eclipse 3.5不了解生型,并标记警告以切换到未选中。令人沮丧的是,Eclipse提出了生皮的注释,这会导致问题比解决。他们应该只是坚持标准。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top