首页 > 解决方案 > 为什么 MAP 使用通用通配符 extends Object 不能容纳任何类型?

问题描述

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

我有一个Map<String, ? extends Object> studentDetails = new HashMap<>();并且我希望它包含任何随机类型。

当我把

studentDetails.put("name", "John"); 
studentDetails.put("friendNames", Arrays.aslist("Kenny","Peter","friend3"));
studentDetails.put("courses", new HashSet<String>());
studentDetails.put("age",18);

编译器给了我

所需类型:捕获?扩展对象,提供:字符串

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

所需类型:捕获?扩展对象,提供:HashSet

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

为什么错了?不应该? extends Object捕获任何类型?如果我将其更改为 Map<String, Object>,那么它可以工作。

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

标签: javagenerics

解决方案


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

List<Integer> ints = new ArrayList<>();
        
List<? extends Object> objs;

List<Integer>是的子类型,List<? extends Object>因此您可以将的实例分配给List<Integer>类型List<? extends Object>。但是您不能执行以下操作,因为您会将字符串添加到整数列表中。编译器会捕捉到它。

objs = ints; // okay
objs.add("abc"); // can't add String to list of ints

地图也是如此。

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

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

编译器不知道您的地图指的是什么,因此您无法向其中添加对象。


推荐阅读