gst*_*low 5 java generics variable-assignment argument-passing generic-method
我面对代码,编译结果让我感到惊讶.
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
}
}
Run Code Online (Sandbox Code Playgroud)
总是我认为如果我将值传递给方法,则意味着方法参数分配给传递的值.
批准是否错误?
Sot*_*lis 10
更正:
您的使用Test3.map()不提供类型参数,编译器无法推断类型参数.无法推断类型参数时,JLS会说以下内容
T然后推断任何尚未推断的剩余类型变量具有类型Object.
所以方法调用看起来像
Map<Object, Object> object = Test3.map();
f(object); //not valid
Run Code Online (Sandbox Code Playgroud)
这可以通过编译器的错误消息来确认:
不兼容的类型:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
116 次 |
| 最近记录: |