将Generic集合作为函数参数进行转换

ela*_*dan 3 java generics casting

我对Java的(7)行为感到有些困惑:

假设我有一个ctor,Foo它需要Map<String,String>一个参数.以下代码:

new Foo(ImmutableMap.of());
Run Code Online (Sandbox Code Playgroud)

产生错误错误:

java:找不到适合Foo(com.google.common.collect.ImmutableMap)构造函数的构造函数Foo(java.util.Map)不适用

尝试强制转换为Map<String, String>显式不起作用,因为编译器抱怨类型不可转换.但是,这很好用:

Map<String, String> map = ImmutableMap.of();
new Foo(map);
Run Code Online (Sandbox Code Playgroud)

到底发生了什么事?为什么编译器对待局部变量的方式与函数参数不同?

McD*_*ell 6

Java编译器似乎无法从构造函数签名中推断出泛型类型,而是回退到擦除类型(相当于Map<Object, Object>.)

使用:

new Foo(ImmutableMap.<String, String> of());
Run Code Online (Sandbox Code Playgroud)