泛型的Java编译器错误

泛型的Java编译器错误,java,eclipse,generics,Java,Eclipse,Generics,我收到一个编译器错误,代码如下: Map<String, String[]> myMap; void set(Map<String, Object> foo) { } set(myMap); // generates error Error: "The method set(Map<String,Object>) in the type XXX is not applicable for the arguments (Map<String,Stri

我收到一个编译器错误,代码如下:

Map<String, String[]> myMap;

void set(Map<String, Object> foo) { }

set(myMap); // generates error

Error: "The method set(Map<String,Object>) in the type XXX is not applicable for the arguments (Map<String,String[]>)"

泛型继承不同于我们对OO继承的常规理解。请看这个

要使代码编译,您可能需要更改方法语法,如下所示:

void set(Map<String, ?> foo) { }
void集(mapfoo){

编辑:正如dasblinkenlight评论的那样,如果您有任何计划在set方法内对映射进行修改,除非您定义了具体类型,否则它将无法工作。

泛型继承不同于我们对OO继承的常规理解。请看这个

要使代码编译,您可能需要更改方法语法,如下所示:

void set(Map<String, ?> foo) { }
void集(mapfoo){

编辑:正如dasblinkenlight评论的那样,如果您计划在set方法中修改映射,则除非您定义了具体的类型,否则它将无法工作。

在泛型中使用类型参数时,继承的工作方式不同

这里有一个过于简化的一般经验法则:


在声明和初始化泛型对象时,
s中的内容必须完全匹配。

在泛型中使用类型参数时,继承的工作方式不同

这里有一个过于简化的一般经验法则:


当声明和初始化泛型对象时,
内的内容必须完全匹配。

尽管
字符串[]
实际上是一个
对象,但这与说
映射实际上是一个
映射不同:泛型的协方差不存在

更改声明

void set(Map<String,Object> foo) { }
但是,尝试向地图添加内容将失败:

对象blah=foo.put(“键”);


由于将内容放入映射似乎是您的方法的目标(毕竟,您称它为
set
),因此如果不指定确切的类型,您将无法使它工作。

尽管
字符串[]
实际上是一个
对象,这并不等于说
Map
实际上是
Map
:泛型的协方差不存在

更改声明

void set(Map<String,Object> foo) { }
但是,尝试向地图添加内容将失败:

对象blah=foo.put(“键”);


由于将内容放入映射似乎是您的方法的目标(毕竟,您调用它
set
)必须有一个原因,如果不指定确切的类型,您将无法使它工作。

也许,Eclipse编译您的代码是因为它的编译器错误

您需要将
set
的签名更改为
set(Map)
以使其可编译


它在第二种情况下编译并带有警告,不是吗?这是因为您使用原始映射(不带泛型)来规避类型安全检查。

也许,Eclipse编译您的代码是因为它的编译器错误

您需要将
set
的签名更改为
set(Map)
以使其可编译


它在第二种情况下编译并带有警告,不是吗?这是因为您使用原始映射(不带泛型)来规避类型安全检查。

映射将不起作用,而只是编译。一旦该方法尝试将任何内容放入
foo
,编译器就会抱怨。要想圆满解决问题,请想想如果这样做有效会发生什么。在
set
方法中,您有一个
Map
,因此您可以愉快地调用
Map.put(“foo”,newsomeobject())
。现在,
myMap
,虽然键入的值是
String[]
,但它的值是
SomeObject
Map
将不起作用,而只是编译。一旦该方法尝试将任何内容放入
foo
,编译器就会抱怨。要想圆满解决问题,请想想如果这样做有效会发生什么。在
set
方法中,您有一个
Map
,因此您可以愉快地调用
Map.put(“foo”,newsomeobject())
。现在,
myMap
,虽然键入的值是
String[]
,但它的值是
SomeObject
Object blah = foo.get("key");