我喜欢java中的泛型功能并经常使用它。但是我有一个问题,如果我使用的是尚未了解泛型的库。一个例子是servlet。如果您使用ServletRequest.getParameterMap()
,则结果将是原始地图,但它仅包含String
作为键,String[]
作为值。所以我想将它分配给Map<String, String[]>
。但是对于这项任务我得到了警告。如何使用该语言避免此警告,而不是简单地使用@SuppressWarnings
注释抑制警告。
答案 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)
正如其他人所说,摆脱这种警告的唯一方法就是压制它。
最佳做法是使用方法和类封装警告。
但是在其他警告的情况下,总是尝试解决制作它们的问题,比如删除未使用的导入等等......它会使您的应用程序更精简,更好。
快乐编码