5

我遇到了代码,编译结果让我感到惊讶。

public class Test3{
    public static<K,V> Map<K,V> map(){return new HashMap<K,V>();}
}



class A{

    static void f(Map<String,Integer> bcMap){}

    public static void main(String[] args){
        f(Test3.map()) //not valid
        Map<String,Integer> m = Test3.map();//valid

    }
}

我一直认为,如果我将值传递给方法,则意味着方法参数分配给传递的值。

是错误的批准吗?

4

1 回答 1

10

更正:

您的使用Test3.map()不提供类型参数,编译器无法推断类型参数。当无法推断类型参数时,JLS 会说以下内容

T任何尚未推断的剩余类型变量然后推断为具有 type Object

所以方法调用看起来像

Map<Object, Object> object = Test3.map(); 
f(object); //not valid

编译器的错误消息证实了这一点:

不兼容的类型:java.util.Map<java.lang.Object,java.lang.Object>无法转换为java.util.Map<java.lang.String,java.lang.Integer>

泛型类型参数默认为Object.

您可以通过指定类型参数来修复它

f(Test3.<String, Integer>map()); // valid
于 2014-03-16T15:08:18.157 回答