是否有任何完全通用的Map.get()版本,即"V get(K key)"

Sri*_*ini 6 java generics

由于Map.get()不是完全通用的,我们经常会发现开发人员传递不同类型的对象(以及bug)的情况.当我们开始使用其他团队的工件/服务时,此类案例的频率上升.Map.get(Object key)不是(完全)泛型的原因是什么原因解释了为什么get()不是完全通用的.

由于我们实际上没有属于不同类型的两个对象的用例,但是"语义上"相等,因此使用Map.get()版本将真正帮助我们在编译时识别这些错误.是否存在可用于生产的任何API?

Mar*_*ers 5

这不是对你的问题的直接答案,但是一些 IDE(至少是 IntelliJ)有一个检查来标记集合的可疑使用,并且这肯定会被它捕获:

Map<String, Integer> map = new HashMap<String, Integer>();
map.put("hello", 5);

//In IntelliJ, this line gives the warning: 
//Map<String, Integer> may not contain objects of type StringBuilder
System.out.println(map.get(new StringBuilder("hello")));
Run Code Online (Sandbox Code Playgroud)

您提到您试图在编译时捕获这些问题,所以我认为值得一提。您可以将其与构建服务器的静态分析工具配对,例如 findbugs。

在 IntelliJ 中,检查称为“可疑集合方法调用”。

编辑 (2011/10/18)

在 FindBugs 中,bug 似乎GC_UNRELATED_TYPES应该捕获这个(尽管我还没有尝试测试这个):

GC:泛型参数和方法参数之间没有关系

对泛型集合方法的调用包含一个与集合参数的类不兼容的参数(即,参数的类型既不是相应泛型类型参数的超类型也不是子类型)。因此,该集合不太可能包含任何与此处使用的方法参数相同的对象。最有可能的是,错误的值传递给了该方法。(...)