[英]If Java String extends Object then why cant it be passed to <? extends Object> type
例如,为什么以下各项不起作用?
Map<String, ? extends Object> table = new HashMap<>();
table.put("K", "V"); //Error V cannot be applied to ? extends String.
但是String必须扩展Object,为什么上面抛出编译器错误?
我得到的IntelliJ错误是
Wrong 2nd Argument Type. Found 'java.lang.String'required: '? extends java.lang.Object'
但是,以下工作原理:
Map<String, ? super Object> table = new HashMap<>();
table.put("K", "V"); //Error V cannot be applied to ? extends String.
现在,以上内容确实很奇怪。 下限对象如何工作?
我的意思是不
? super Object
是指“未知的对象超类”?
AFAIK对象位于Java类层次结构的根。
因为? extends Object
? extends Object
并不表示“任何扩展Object的类型”。 它的意思是“某种特定的类型,只要它扩展了Object,我们就不知道它是什么。” 区别是细微的,但意义重大!
以下代码完全可以编译:
Map<String, Integer> stringToInteger = new HashMap<>();
Map<String, ? extends Object> stringToWildcard = stringToInteger;
可以编译是有道理的。 stringToWildcard
是一个映射,其值是“某种类型,只要它扩展对象”,而Integer是一种扩展对象的类型。
因此,假设您的table.put("K", "V")
工作。 我们可以这样做:
Map<String, Integer> stringToInteger = new HashMap<>();
Map<String, ? extends Object> stringToWildcard = stringToInteger;
stringToWildcard.put("K", "V");
Integer value = stringToInteger.get("K");
这将导致最后一行出现ClassCastException,因为字符串“ V”无法转换为整数。
相反,编译器将禁止table.put("K", "V")
。 它告诉您的是:“嘿,值必须是某种特定类型。除了扩展对象之外,我不知道该类型是什么。但是我不能让您放入String,因为我没有不知道该类型是否为字符串。”
这个项目解决了我的问题:
我在上面的解释中唯一的问题是形式的构造
List<? super T> myList;
帖子继续说,您可以将任何类型T添加到myList或任何T的Supertype 实例 。 那似乎不准确。 看起来您只能添加T或其任何子类型,因为T的子类型自动是T的任何超类型的子类型。 在那里有点含糊。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.