栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

通用下限未绑定vs上限通配符

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

通用下限未绑定vs上限通配符

该问题的答案表明,当方法采用通配符通用类型时,可以访问或修改集合,但不能同时访问或修改集合。(凯西和伯特)

这是一个很合理的第一近似值,但并不完全正确。更正确的是:

您只能将null添加到,

Collection<? extends Dog>
因为其add方法采用的参数
? extendsDog
。每当调用方法时,都必须传递声明的参数类型的子类型的参数。但是对于参数类型
? extendsDog
,如果表达式为则编译器只能确保参数为兼容类型
null
。但是,您当然可以通过调用
clear()
或来修改集合
remove(Object)

另一方面,如果您从a读取

Collection<? super Dog>
,则其迭代器具有return type
? superDog
。也就是说,它将返回对象的某个未知超类型的子类型的对象
Dog
。但是不同的是,Collection可以
Collection<Object>
仅包含的实例
String
。因此

for (Dog d : collection) { ... } // does not compile

因此,我们唯一知道的是返回了Object的实例,即,迭代此类Collection的唯一类型正确的方法是

for (Object o : collection) { ... }

但是可以从一个集合中读取内容,而您只是不知道将得到什么类型的对象。

我们可以轻松地将该观察结果概括为:

class G<T> { ... }

G<? extends Something> g;

我们只能将null传递给声明类型的方法参数

T
,但是我们可以调用返回类型的方法
T
,并为结果分配一个type变量
Something

另一方面,对于

G<? super Something> g;

我们可以将任何类型的表达式传递

Something
给具有声明类型的方法参数
T
,并且可以调用具有返回类型的方法
T
,但只能将结果赋给类型变量
Object

总之,使用通配符类型的限制仅取决于方法声明的形式,而不取决于方法的用途。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/516079.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号