如果使用旧库,如何避免Java中的unchecked-conversion-warning?

我喜欢java中的genericsfunction并经常使用它。 但是我有一个问题,如果我使用的是尚未了解generics的库。 一个例子是servlet。 如果使用ServletRequest.getParameterMap() ,结果将是原始映射,但它仅包含String作为键, String[]作为值。 所以我想将它分配给Map 。 但是对于这项任务我得到了警告。 如何使用该语言避免此警告,而不是通过使用@SuppressWarnings注释来抑制警告。

正如其他人所说,除非通过压制它们,否则无法避免警告。 问题恕我直言,要么你必须使用适用于小范围的注释来丢弃你的代码,要么全局忽略它们并冒险。

IIRC有一项建议是生成警告,其中返回原始类型而不是通话。

同时,我认为最好的方法是使用包装器方法,以便警告仅限于一个地方,可以安全地忽略它们:

 class NoWarn { public static Map getParameterMap(ServletRequest r) { @SuppressWarnings("unchecked") Map result = r.getParameterMap(); return result; } } 

注意编辑此答案的注释是注释不能在方法体内。 这是不正确的,上面的语法是正确的。 我已经恢复了改变。

您可以做的最简洁的事情是封装从遗留代码到通用代码的转换,并仅在那里禁止警告。

例如,您可以在旧版库中放置通用外观,但这可能并不总是值得的。

如何使用语言避免此警告,而不是通过SuppressWarnings-annotation简单地抑制警告。

注释避免语言警告的方法。 没有其他办法。

我认为你不能。 除非您禁止警告,否则将显示警告,或从IDE的警告列表中过滤警告。

我有同样的问题,我只是关闭所有通用警告,我很高兴:)你也可以关闭serialVersionUID警告,因为很多人不使用serialVersionUID。

在Eclipse中 – Window / Perferences / Java / Compiler / Errors / Warnings并关闭所有Generic类型。

PS许多错误的警告会让你忽略所有的警告,有些可能会有用。

偶然发现这个问题,因为我也试图想办法避免在这种情况下使用抑制注释。 我找到了另一种我认为值得一提的替代方案:

  Map map = servletRequest.getParameterMap(); String[] values = (String[]) map.get("key"); 

我们基本上使用通配符’?’ 表示地图可以包含任何类型的键和值。

我在这里看到的潜在缺点是我们在获取值时进行了显式转换,我认为这会在运行时产生轻微的性能开销。

正如其他人所说,摆脱这种警告的唯一方法就是压制它。

最佳实践是使用方法和类封装警告。

但是在其他警告的情况下,总是尝试解决制作它们的问题,比如删除未使用的导入等等……它会使您的应用程序更精简,更好。

快乐的编码