Java 为什么映射使用通用通配符扩展对象不能包含任何类型?

Java 为什么映射使用通用通配符扩展对象不能包含任何类型?,java,generics,Java,Generics,抱歉,如果问题标题令人困惑。这就是我的意思 我有一个Map studentDetails=newhashmap()并且我希望它能容纳任何随机类型 当我把 studentDetails.put("name", "John"); studentDetails.put("friendNames", Arrays.aslist("Kenny","Peter","friend3"));

抱歉,如果问题标题令人困惑。这就是我的意思

我有一个
Map studentDetails=newhashmap()并且我希望它能容纳任何随机类型

当我把

studentDetails.put("name", "John"); 
studentDetails.put("friendNames", Arrays.aslist("Kenny","Peter","friend3"));
studentDetails.put("courses", new HashSet<String>());
studentDetails.put("age",18);
studentDetails.put(“姓名”、“约翰”);
studentDetails.put(“friendNames”,array.aslist(“Kenny”,“Peter”,“friend3”);
studentDetails.put(“课程”,新HashSet());
学生详细信息。输入(“年龄”,18岁);
编译器给了我以下信息:

所需类型:捕获?扩展对象,前提是: 串

所需类型:捕获?扩展对象,前提是: ArrayList

所需类型:捕获?扩展对象,前提是: 哈希集

所需类型:捕获?扩展对象,前提是: 整数

为什么错了?不应该
?扩展对象
捕获任何类型?如果我把它改成Map,它就可以工作了


任何帮助都将不胜感激!谢谢

出于同样的原因,您不能这样做:

List<Integer> ints = new ArrayList<>();
        
List<? extends Object> objs;
地图也是如此

Map<String, ? extends Object> map;
Map<String, Integer> intMap = new HashMap<>();

map = intMap; // okay
map.put("abc", "abc");  //oops
Map;
Map intMap=newhashmap();
map=intMap;//可以
地图放置(“abc”、“abc”)//哎呀

编译器不知道映射所指的是什么,因此无法向其添加对象。

因为类型为
意味着您不知道该类型应该是什么。如果你不知道应该是什么类型,你就不能输入任何东西,因为编译器不知道它是不是正确的类型。可以包含任何类型对象的容器的通用类型是
对象
,而不是
?扩展对象
。如果希望贴图能够容纳任何内容,请使用对象
作为第二个通用参数。@Turing85但为什么?扩展对象不起作用?我的理解是任何类型的扩展对象。简而言之,
可以是任何类型。您试图插入一个
字符串
,但
可能是一个
列表
。或
地图
。或
汽车
。你不知道。您可以传递的唯一有效值是
null
。让我补充一下:
并不意味着
对象的任何子类型,而是
对象的一个未知但特定的子类型。您好,谢谢您的回答,我现在已经部分清楚了,但我仍然有点困惑,所以在您的示例中,即使我做了objs.add(new integer(1)),它仍然失败。编译器难道不知道它是一个
列表
,因为我传递的int是一个
列表
Map<String, ? extends Object> map;
Map<String, Integer> intMap = new HashMap<>();

map = intMap; // okay
map.put("abc", "abc");  //oops