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

时间:2014-10-14 06:53:30

标签: java generics casting

我对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);

这到底是怎么回事?为什么编译器对局部变量的处理方式与函数参数不同?

3 个答案:

答案 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>时。

您应该像new Foo(ImmutableMap<String ,String>.of());

一样使用它

答案 2 :(得分:4)

Java 7需要局部变量来正确推断Immutable.of()的返回类型。在Java 8中,他们对此进行了改进。参见&#34;改进的类型推断&#34;在这里:http://docs.oracle.com/javase/8/docs/technotes/guides/language/enhancements.html