我对Java的行为感到有点困惑:
说我有一个Foo
的ctor,它以Map<String,String>
为参数。以下代码:
new Foo(ImmutableMap.of());
产生错误错误:
java:找不到合适的构造函数 美孚(com.google.common.collect.ImmutableMap) 构造函数Foo(java.util.Map) 不适用
尝试强制转换为Map<String, String>
并不能正常工作,因为编译器抱怨类型不可转换。但是,这很好用:
Map<String, String> map = ImmutableMap.of();
new Foo(map);
这到底是怎么回事?为什么编译器对局部变量的处理方式与函数参数不同?
答案 0 :(得分:6)
Java编译器似乎无法从构造函数签名中推断出泛型类型,而是回退到擦除类型(相当于Map<Object, Object>
。)
使用:
new Foo(ImmutableMap.<String, String> of());
答案 1 :(得分:4)
ImmutableMap.of()
返回空传递的Map<Object,Object>
,对于此类型,未定义构造函数。
但是,当您使用Map<String, String> map = ImmutableMap.of();
而不是以纯类型安全方式特定地返回Map<String ,String>
时。
答案 2 :(得分:4)
Java 7需要局部变量来正确推断Immutable.of()的返回类型。在Java 8中,他们对此进行了改进。参见&#34;改进的类型推断&#34;在这里:http://docs.oracle.com/javase/8/docs/technotes/guides/language/enhancements.html