有人可以解释以下语法的工作原理吗?
public static <K, V> HashMap<K, V> getMap(){
return new HashMap<K, V>();
}
同样,如果这个方法是在我自己的非可实例化的util类中实现的,那么它可以用作创建map实例的静态工厂方法,对吧?
Map<Integer, String> myMap = MyUtil.getMap();
然后会返回一个新的HashMap,其中包含Integer键和String值,我是对的吗? 如果是这样,编译器和VM如何实现键的键和条目类型?
如果有人能解释Java是如何做到的,我真的很感激。
答案 0 :(得分:4)
你问'Java如何做到这一点'。 Java是在语言规范中定义的,该规范没有规定如何实现规范。所以选择解决方案真的取决于实现。因此,如果您真的想知道特定编译器或解释器如何实现类型推断,我怀疑需要熟悉该工具的人员来解决这个问题。
如果您的问题确实是“规则是什么”,那么您会在specification itself,Java API documentation和standard Java tutorial中找到相当好的解释(在降低正式程度)。
这是一个非常复杂的领域,需要处理许多棘手的案件 - 事实上,它涉及三个正确理解的过程(减少,合并和解决)。但是,如果您正在寻找一个简单的摘要,我会将其声明为“在实例化类或方法时,用尽可能最具体的类型替换每个泛型类型”。在您的情况下,将K
替换为Integer
,将V
替换为String
,这是最有效的推断。