Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将泛型集合强制转换为函数参数_Java_Generics_Casting - Fatal编程技术网

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 =

我对Java在以下方面的行为感到有点困惑:

假设我有一个用于
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());