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

时间:2009-07-15 09:47:39

标签: java generics warnings

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

7 个答案:

答案 0 :(得分:41)

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

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

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

class NoWarn {
  public static Map<String, String[]> getParameterMap(ServletRequest r) 
  {
    @SuppressWarnings("unchecked")
    Map<String, String[]> result = r.getParameterMap();
    return result;
  }
}

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

答案 1 :(得分:8)

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

E.g。你可以在你的旧库上放置一个通用的外观,虽然这可能并不值得。

答案 2 :(得分:2)

  

我怎样才能避免这个警告   语言,而不是简单地抑制   警告与   SuppressWarnings-注解

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

Eclipse中的

- Window / Perferences / Java / Compiler / Errors / Warnings并关闭所有Generic类型。

P.S。许多不良警告会让您忽略所有警告,有些可能会有用。

答案 5 :(得分:1)

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

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

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

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

答案 6 :(得分:0)

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

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

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

快乐编码