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。

原文地址:https://www.cnblogs.com/shuada/p/6571261.html