在调用泛型方法时如何使用Generic方法而不传递Type Parameters?

时间:2015-11-24 18:51:05

标签: java generics

我能理解并想象出这是如何运作的:

public static void main(String[] args) {
    String passString = foo("hello");
    Integer passInteger = foo(5);
}
public static <K> K foo(K k) {
    return k;
}

编译器知道K在第一种情况下是String,在第二种情况下是Integer,因为我们在调用foo时将对象作为参数传递。

但我无法理解这是如何运作的:

public static void main(String[] args) {
    HashMap<Integer, String> myMap
            = newInstance();
    myMap.put(1, "Hello");
}
public static <K,V> HashMap<K,V> newInstance() {
    return new HashMap<K, V>();
}

编译器是否实际检查我将myMap分配给哪些人?是否有某种隐藏的铸造在这里?也许我错过了一些明显的东西,但是K和V在编译时如何解析为Integer和String?

1 个答案:

答案 0 :(得分:3)

  

编译器是否实际检查我将myMap分配给了什么?

是的,这正是它的作用。这称为target type inference或“目标打字”。

值得注意的是,在{8}中,javac能够做出这些推断的能力得到了改善 - 现在你需要提供明确类型见证的地方更少(如Collections.<String>emptySet()

相关问题