泛型的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");