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

Java:有界通配符或有界类型参数?

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

Java:有界通配符或有界类型参数?

这取决于您 需要 做什么。如果要执行以下操作,则需要使用bounded type参数:

public <T extends Shape> void addIfPretty(List<T> shapes, T shape) {    if (shape.isPretty()) {       shapes.add(shape);    }}

在这里我们有一个

List<T> shapes
和一个
T shape
,因此我们可以放心
shapes.add(shape)
。如果已声明
List<?extends Shape>
,则 不能 安全地
add
使用它(因为您可能有
List<Square>
Circle
)。

因此,通过给有界类型参数命名,我们可以选择在通用方法的其他地方使用它。当然,并非总是需要此信息,因此,如果您不需要太多有关类型的信息(例如your

drawAll
),那么仅使用通配符就足够了。

即使您不再引用边界类型参数,如果您有多个边界,仍然需要边界类型参数。这是Angelika
Langer的Java泛型常见问题解答中的报价

通配符绑定和类型参数绑定有什么区别?

通配符只能有一个界限,而类型参数可以有多个界限。通配符可以有一个下限或上限,而类型参数没有下限。

通配符界限和类型参数界限经常被混淆,因为它们既称为界限,又具有部分相似的语法。[…]

语法

  type parameter bound     T extends Class & Interface1 & … & InterfaceN  wildcard bound        upper bound          ? extends SuperType      lower bound          ? super   SubType

通配符只能有一个界限,即下限或上限。不允许使用通配符范围列表。

相反,类型参数可以有多个界限,但是没有类型参数的下界。

从行情 有效的Java第二版,第28项:使用界通配符来增加灵活性API

为了获得最大的灵活性,请在代表生产者或消费者的输入参数上使用通配符类型。[…] PECS代表生产者-

extends
,消费者-
super
[…]

不要将通配符类型用作返回类型
。与其给用户提供更多的灵活性,不如说是迫使他们在客户端代码中使用通配符类型。正确使用的通配符类型对于类的用户几乎是不可见的。它们使方法接受应接受的参数,并拒绝应拒绝的参数。
如果类的用户必须考虑通配符类型,则类的API可能存在问题

应用PECS原理,我们现在可以返回到

addIfPretty
示例,并通过编写以下代码使其更加灵活:

public <T extends Shape> void addIfPretty(List<? super T> list, T shape) { … }

现在我们可以

addIfPretty
说a
Circle
到a
List<Object>
。这显然是类型安全的,但是我们的原始声明不够灵活,无法允许它。

相关问题

  • Java泛型:什么是PECS?
  • 有人可以解释什么
    <? super T>
    意思,什么时候应使用它,以及该构造应如何与
    <T>
    and 配合使用
    <? extends T>

摘要

  • 一定要使用有界类型参数/通配符,它​​们会增加API的灵活性
  • 如果类型需要多个参数,则别无选择,只能使用有界类型参数
  • 如果类型需要下限,则别无选择,只能使用有界通配符
  • “生产者”具有较高的界限,“消费者”具有较低的界限
  • 不要在返回类型中使用通配符


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

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

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