Java 6:不支持@SuppressWarnings(“rawtypes”)警告
我搬到了一台装有最新Sun Java编译器的新机器上,并在现有的Java 6代码中注意到了一些警告。 Eclipse IDE中,build议我使用以下注释来赋值:
@SuppressWarnings("rawtypes")
例如:
class Foo<T> { ... } ... @SuppressWarnings("rawtypes") Foo foo = new Foo();
当我用旧的编译器(JDK 1.6.0_20)移回机器时,我注意到这个较老的编译器现在警告抑制“rawtypes”警告,声称这种抑制是不受支持的,并build议用@SuppressWarningsreplace它( “未登记”)。 此外,还有一些地方,最新的编译器,默认情况下,让我把“unchecked”和“rawtypes” – 编译与旧编译器代码重现相同的警告。
我怎样才能强制执行这两者之间的向前/向后兼容性,以避免编译器产生警告?
您可以使用eclipse编译器和javac支持的@SuppressWarnings("unchecked")
。
但请记住您的编译器使用@SuppressWarnings
注释,它可以有自己的值。 JLS只强制编译器理解“未选中”和“不推荐”(现在)的值。
编译器供应商应该logging它们支持的警告名称以及这种注释types。 鼓励他们合作,确保在多个编译器中使用相同的名称 。
如果您使用Helios,则需要设置特定的选项来允许@SuppressWarnings("unchecked")
而不是@SuppressWarnings("rawtypes")
,
如果无法使用新标记更新代码,则可以在启动Eclipse时设置
suppressRawWhenUnchecked=true
系统属性。
资源:
- JLS – @SuppressWarnings()
- Eclipse JDT ( Java编译器 , 用于@SuppressWarnings注释的新“rawtypes”标记 )
编辑:这是现在无法使用的knol文章,作为参考,最初由Alex Miller写的。
Java中的@SuppressWarnings注释
用于抑制各种警告的标准注释
SuppressWarnings注释在Java SE 5中作为标准注释添加。
定义
@SuppressWarnings注释在Java语言规范9.6.1.5节中定义 。 本节规定:
注释types
SuppressWarnings
支持程序员控制Java编译器发出的警告。 它包含一个由String
的数组。 如果一个程序声明注释了@SuppressWarnings(value = {S1, ... , Sk})
,那么Java编译器不能报告由S1,…,Sk之一标识的任何警告是由于注释声明或其任何部分而产生的。未经检查的警告通过string“
unchecked
”来标识。关于
@Deprecation
的后续部分还提到可以用@SuppressWarnings("deprecation")
来抑制这些警告。有效的警告types
规范中提到的唯一两个警告string是“未选中”和“弃用”。 但是,Sun JDK在编译器中使用了一组更大的string。 您可以通过执行以下命令确定当前设置:
javac -X
这将显示(其中包括)-Xlint的有效设置。
例如,Sun JDK 1.5显示:
- 全部 – 从这个代码中禁止所有的警告
- 弃用 – 禁止使用弃用代码的警告
- 未经检查 – 禁止未经检查的电话或未经检查的强制转换的警告
- fallthrough – 如果一个开关没有find有效的情况下通过压制警告(并且没有默认)
- path –
- serial – 如果Serializable类没有定义serialVersionUID,则禁止警告
- 最后 – 在一个finally里面(这会忽略返回的try)
而Sun JDK 1.6增加了:
- 投
- divzero – 如果检测到整数除以零,则抑制警告
- 空
- 覆盖
- 没有
IDE和静态分析工具通常支持@SuppressWarnings的大量其他可能的值。 这些值对应于由IDE执行的特定静态分析检查。
蚀
Eclipse 3.3的Eclipse警告值logging在JDT文档中 。
- 全部压制所有警告
- 拳击 – 禁止相对于拳击/拆箱操作的警告
- 施放 – 压制与施放操作相关的警告
- dep-ann – 禁止相对于不推荐使用的注释的警告
- 弃用 – 禁止相对于弃用的警告
- 突破 – 相对于switch语句中缺less的中断而言,可以抑制警告
- 最后 – 相对于最后阻止不返回的警告
- 隐藏 – 隐藏相对隐藏variables的本地人的警告
- 不完整的开关 – 禁止相对于在switch语句中缺less条目的警告(枚举大小写)
- nls – 禁止相对于非nlsstring文字的警告
- null – 禁止相对于空分析的警告
- 限制 – 禁止使用劝阻或禁止引用的警告
- serial – 禁止相对于serializable类缺lessserialVersionUID字段的警告
- 静态访问 – 禁止相对于不正确的静态访问的警告
- 合成访问 – 禁止相对于来自内部类的未优化访问的警告
- 未经检查 – 禁止相对于未经检查的操作的警告
- 不合格现场访问 – 禁止相对于现场访问的警告不合格
- 未使用 – 禁止相对于未使用的代码的警告
的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不理解rawtypes并标记警告切换到未选中状态。 令人沮丧的是,Eclipse提出了引起更多问题而不是解决的rawtypes注释。 他们应该坚持一个标准的。