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节中定义 。 本节规定:

    注释typesSuppressWarnings支持程序员控制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注释。 他们应该坚持一个标准的。