Java 地图<;字符串,对象>;类型不适用于参数映射<;字符串,字符串[]>;

Java 地图<;字符串,对象>;类型不适用于参数映射<;字符串,字符串[]>;,java,generics,Java,Generics,为什么我会犯这个错误 public void getParameters(Map<String,Object> param){ } public void test(){ Map<String,String[]> testMap = new HashMap<String,String[]>(); getParameters(testMap); // type is not applicable error here } 字符串扩展

为什么我会犯这个错误

public void getParameters(Map<String,Object> param){

}

public void test(){

    Map<String,String[]> testMap = new HashMap<String,String[]>();

    getParameters(testMap);  // type is not applicable error here

}

字符串扩展对象以便工作,但泛型不能这样工作


这里有很好的解释

字符串扩展了对象,这样可以工作,但泛型不能这样工作


这里的解释很好

您需要与相关类的类型参数精确匹配。这意味着
Map
不可分配给
Map
。要使代码正常工作,请使用通配符:

public void getParameters(Map<String, ? extends Object> param){

}
public void getParameters(映射参数){
}
或者在这种情况下只是

public void getParameters(Map<String, ?> param){

}
public void getParameters(映射参数){
}

您需要与相关类的类型参数精确匹配。这意味着
Map
不可分配给
Map
。要使代码正常工作,请使用通配符:

public void getParameters(Map<String, ? extends Object> param){

}
public void getParameters(映射参数){
}
或者在这种情况下只是

public void getParameters(Map<String, ?> param){

}
public void getParameters(映射参数){
}

Java使用copy by value,这意味着您可以安全地执行此操作

String s = "Hello";
Object o = s;
o = 5; // `s` is not corrupted by this.
但是,您不能更改引用其他类型的内容

Map<String, String> map = new HashMap<>();
map.put("hi", "hello");
Map<String, Object> map2 = (Map) map;
map2.put("hi", 5); // map now has an Integer value in it.

String s = map.get("hi"); // ClassCastException.
Map Map=newhashmap();
放在地图上(“你好”、“你好”);
Map map2=(Map)Map;
地图2。把“嗨”,5)放进去映射现在包含一个整数值。
字符串s=map.get(“hi”);//ClassCastException。
这就是为什么您不能将
Map
作为
Map
安全地传递,因为后者会允许您这样做

Object[] os = new Integer[1];
param.put("hi", os); // Your Map<String, String[]> is corrupted.
Object[]os=新整数[1];
参数put(“hi”,os);//您的地图已损坏。

Java使用copy by value,这意味着您可以安全地执行此操作

String s = "Hello";
Object o = s;
o = 5; // `s` is not corrupted by this.
但是,您不能更改引用其他类型的内容

Map<String, String> map = new HashMap<>();
map.put("hi", "hello");
Map<String, Object> map2 = (Map) map;
map2.put("hi", 5); // map now has an Integer value in it.

String s = map.get("hi"); // ClassCastException.
Map Map=newhashmap();
放在地图上(“你好”、“你好”);
Map map2=(Map)Map;
地图2。把“嗨”,5)放进去映射现在包含一个整数值。
字符串s=map.get(“hi”);//ClassCastException。
这就是为什么您不能将
Map
作为
Map
安全地传递,因为后者会允许您这样做

Object[] os = new Integer[1];
param.put("hi", os); // Your Map<String, String[]> is corrupted.
Object[]os=新整数[1];
参数put(“hi”,os);//您的地图已损坏。

这完全正常。您需要更改
getParameters
方法以接受
Map
String[]
is-a
Object
,但
Map
is-NOT-a
Map
。继承不是这样的,这很正常。您需要更改
getParameters
方法以接受
Map
String[]
is-a
Object
,但
Map
is-NOT-a
Map
。继承不是这样的。