繁体   English   中英

如果Java String扩展了Object,那么为什么不能将其传递给 <? extends Object> 类型

[英]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,因为我没有不知道该类型是否为字符串。”

这个项目解决了我的问题:

如何添加到列表<? 扩展Number>数据结构?

我在上面的解释中唯一的问题是形式的构造

List<? super T> myList;

帖子继续说,您可以将任何类型T添加到myList或任何T的Supertype 实例 那似乎不准确。 看起来您只能添加T或其任何子类型,因为T的子类型自动是T的任何超类型的子类型。 在那里有点含糊。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM