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