Java 从无类型参数Map到有类型参数Map传值的一个问题
import java.util.HashMap; import java.util.Map; public class MapTest { public static void main(String[] args) { Map map = new HashMap(); map.put("one", 1); func(map); } public static void func(Map<String, String> map) { System.out.println(map.get("one")); } }
如上代码运行报:Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
原因:func方法在编译时,println方法默认用的是:
public void println(String x) { synchronized (this) { print(x); newLine(); }
}
println的入参是String类型,这是根据func方法的入参Map<String, String> map推断而来的。
main函数中的map没有提供类型参数,默认是Map<Object,Object>,虽然实际是Map<String,Integer>,但传给func是不会报错的。
println虽然有无数个重载版本,也有int的入参,但这里却被编译器限死了只能用String的入参,导致报ClassCastException。