Java 将泛型集合强制转换为函数参数
我对Java在以下方面的行为感到有点困惑: 假设我有一个用于Java 将泛型集合强制转换为函数参数,java,generics,casting,Java,Generics,Casting,我对Java在以下方面的行为感到有点困惑: 假设我有一个用于Foo的ctor,它将Map作为参数。以下代码: new Foo(ImmutableMap.of()); 生成错误: java:找不到适合的构造函数 Foo(com.google.common.collect.ImmutableMap) 构造函数Foo(java.util.Map) 不适用 试图显式地强制转换到映射无法正常工作,编译器会抱怨类型不可转换。但是,这很管用: Map<String, String> map =
Foo
的ctor,它将Map
作为参数。以下代码:
new Foo(ImmutableMap.of());
生成错误:
java:找不到适合的构造函数
Foo(com.google.common.collect.ImmutableMap)
构造函数Foo(java.util.Map)
不适用
试图显式地强制转换到映射
无法正常工作,编译器会抱怨类型不可转换。但是,这很管用:
Map<String, String> map = ImmutableMap.of();
new Foo(map);
Map Map=ImmutableMap.of();
新富(地图),;
这到底是怎么回事?为什么编译器对局部变量的处理与函数参数的处理不同?Java编译器似乎无法从构造函数签名推断泛型类型,并返回到已擦除的类型(相当于
映射
)
使用:
newfoo(ImmutableMap.of());
方法签名中的ImmutableMap.of()
返回空的Map
,该值被传递,并且对于此类型,未定义构造函数
但是当您使用Map Map=ImmutableMap.of()时代码>比它以纯类型安全的方式专门返回Map
您应该这样使用它Java 7需要局部变量来正确推断不可变的.of()的返回类型。在Java8中,他们改进了这一点。请参见此处的“改进的类型推断:很好的答案。我突然意识到,调用哪个构造函数可能是不明确的(若有第二个接受Map的构造函数,那个么它确实无法推断要调用哪个构造函数)
new Foo(ImmutableMap.<String, String> of());