2015-07-20 47 views
4

有人可以解释下面的语法是如何工作的吗?java类型推断如何工作?

public static <K, V> HashMap<K, V> getMap(){ 
    return new HashMap<K, V>(); 
} 

如,如果该方法在非实例化的Util类我自己实现了这个可以作为一个静态的工厂方法来创建地图的情况下,对吧?

Map<Integer, String> myMap = MyUtil.getMap(); 

然后会返回一个新的HashMap的Integer键和字符串值的条目,我是吗? 如果是这样,编译器和虚拟机如何实现映射的键和类型?

我真的很感激,如果有人能解释Java如何做到这一点。

+2

你看过[Type Inference文档](https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html)吗? – aug

+3

@Codebender:这不是真的 - 给它一个镜头。 –

+0

@Codebender我曾尝试把工作正常。现在很困惑.. – javabot

回答

3

你问'Java如何做到这一点'。 Java是在语言规范中定义的,并没有规定如何实现规范。因此,选择解决方案真的取决于实施。所以如果你真的想知道一个特定的编译器或解释器如何实现类型推断,我怀疑这需要熟悉该工具的人来解决。

如果你的问题确实是'规则是什么',那么你会发现他们在specification itself,Java API documentationstandard Java tutorial(正式程度越来越低)中的解释相当不错。

这是一个非常复杂的区域,需要处理很多繁琐的案例 - 事实上,它涉及三个过程以正确理解(还原,合并和解决)。但是如果你正在寻找一个简单的总结,我会说它是“当实例化一个类或方法时,用最具体的类型替换每个泛型类型”。在你的情况下用IntegerV替换KString是最有意义的推论。

+0

你是对的。我想我是在担心错误的东西。:( – javabot