Java 6:不支持@SuppressWarnings(“ Rawtypes”)警告
-
01-10-2019 - |
题
我搬到了一台具有最新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
开始日食时可以设置系统属性。
资源 :
- JLS- @suppresswarnings()
- Eclipse JDT (Java编译器, @suppresswarnings注释的新“ rawtypes”令牌)
编辑:这是现在不可用的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提出了生皮的注释,这会导致问题比解决。他们应该只是坚持标准。