java - 为什么 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>,那么它可以工作。
任何帮助,将不胜感激!谢谢!
解决方案
出于同样的原因,您不能这样做:
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
编译器不知道您的地图指的是什么,因此您无法向其中添加对象。
推荐阅读
- web-services - SOAP:如何分析 WSDL 和 XSD 文件?
- mysql - Mysql按第一个表日期分组并计算第二个表中的不同字段
- javascript - Angular 5,组件正在无缘无故地初始化
- git - 将嵌套文件夹推送到 GitHub 是否安全?
- sql-server - SQL Server CASE 表达式不会短路吗?
- r - 在 R / RStudio 中显示数值精度
- python - 如何将数字 numpy 数组更改为 char 数组?
- python - 确定在积极的客户参与方面哪些是增长最快的用户
- jsp - 如何重新运行 scriptlet?
- outlook - Outlook 作为放置目标是否支持 IAsyncOperation?