当前位置: 首页 > 面试题库 >

Java 6:不支持的@SuppressWarnings(“ rawtypes”)警告

向俊贤
2023-03-14
问题内容

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

@SuppressWarnings("rawtypes")

例如:

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

当我使用较旧的编译器(JDK
1.6.0_20)返回机器时,我注意到该较旧的编译器现在警告禁止“原始类型”警告,声称不支持这种禁止,并建议使用@SuppressWarnings替换它。
(“未选中”)。同样,在某些地方,最新的编译器默认情况下使我同时输入“ unchecked”和“
rawtypes”-使用较旧的编译器编译该代码会产生相同的警告。

如何在两者之间强制执行向后/向前兼容性,以使两个编译器均不生成警告?


问题答案:

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

但是请记住,@SuppressWarnings注释由编译器使用,可以具有自己的值。JLS仅强制编译器了解“ unchecked”和“
deprecated”值(目前)。

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

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

如果无法使用新令牌更新代码,则suppressRawWhenUnchecked=true可以在启动Eclipse时设置system属性。

资源:

  • JLS-@SuppressWarnings()
  • Eclipse JDT( Java编译器@SuppressWarnings批注的新“ rawtypes”令牌

编辑:这是现在不可用的knol文章,它最初是由Alex Miller撰写的,用作参考。

用于消除各种警告的标准注释

SuppressWarnings注释已作为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显示:

  • all-禁止显示此代码中的所有警告
  • 不推荐使用-禁止使用不推荐使用的代码发出警告
  • 未选中-禁止来自未选中呼叫或未选中演员表的警告
  • fallthrough-如果开关掉线而没有找到有效的情况(没有默认值),则抑制警告
  • 路径-
  • serial-如果Serializable类未定义serialVersionUID,则禁止显示警告
  • 最终-抑制警告在final内返回(它将通过尝试忽略返回)

Sun JDK 1.6增加了:

  • divzero-如果检测到整数被零除,则禁止显示警告
  • 空的
  • 覆写
  • 没有

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

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

  • 全部-禁止显示所有警告
  • 装箱-取消有关装箱/拆箱操作的警告
  • 投放-取消与投放操作有关的警告
  • dep-ann-禁止有关已弃用注释的警告
  • 弃用-抑制有关弃用的警告
  • fallthrough-抑制与switch语句中缺少中断有关的警告
  • 最终-抑制相对于不再阻止的最终阻止的警告
  • 隐藏-抑制相对于隐藏变量的本地人的警告
  • incomplete-switch-禁止显示与switch语句中缺少条目有关的警告(枚举)
  • nls-抑制相对于非nls字符串文字的警告
  • null-禁止有关null分析的警告
  • 限制-抑制有关使用不推荐或禁止使用的引用的警告
  • serial-抑制有关可序列化类的缺少serialVersionUID字段的警告
  • 静态访问-抑制与错误的静态访问相关的警告
  • 综合访问-禁止有关内部类未优化访问的警告
  • 未选中-取消有关未选中操作的警告
  • 非限定字段访问-禁止有关非限定字段访问的警告
  • 未使用-禁止显示有关未使用代码的警告

IntelliJ

NetBeans

例子

指定单个警告的示例:

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

使用两个警告的示例:

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


 类似资料:
  • Java7在类中引入了对ISO 8601格式的支持,通过字符(而不是大小写)。在Java6中支持这样的格式需要预处理,所以最好的方法就是这个问题。 这个新格式是(大写Z)的超集,还有两个其他变体: null null 请注意,上面的子类对象必须使用相应的基于模式进行初始化,也就是说,如果子类是,并且您希望解析符合模式的日期,那么您应该使用实例化为 在前面提到的问题中,建议使用regex来去掉“:”

  • 同时将warning的值设置为“all”或,没有任何结果。 checkstyle的文档很差。一些想法?

  • 我需要在JAX-WS中通过客户端连接到外部服务器。客户端在Wildfly 8上运行。使用Java8连接是正常的。但我在Java7中连接到服务器时遇到了问题(我尝试了u45、67、79)。服务器端安全性的属性为https://www.ssllabs.com/ssltest/analyze.html?d=app.bundesnetzagentur.de 在部分“密码套件”中有四个密码。源代码不应支持J

  • 本文向大家介绍解决Tensorflow 使用时cpu编译不支持警告的问题,包括了解决Tensorflow 使用时cpu编译不支持警告的问题的使用技巧和注意事项,需要的朋友参考一下 使用TensorFlow模块时,弹出错误Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AV

  • 我已经搜索了几天,通过试错尝试了各种配置,但我没有能够纠正我的配置。我的专长是数据库设计和开发,所以服务器配置一直很有挑战性。 我在一个LEMP堆栈上,我安装了Wave框架。Wave是一个PHP微框架,它松散地遵循模型-视图-控件体系结构和工厂方法设计模式http://www.waveframework.com/Wave/doc/index.htm构建 请帮助,我的配置粘贴在下面。 nginx.c