让我们假设以下类层次 struct :

class A{}
class B extends A{}
class C extends B{}
class D extends C{}

在Java中,可以使用以下泛型定义通配符:

List<? extends A> aOrDown;//A or any subtype of A
List<? super D> dOrUp;//D or any supertype of D

是否可以将同一通配符同时绑定到上限和下限?

我会这样想象:

List<? extends A super B> combined;
List<? extends A & super B> combined;

然而,这些似乎会引发编译时错误.

有没有办法将通用通配符绑定到类层次 struct 的特定部分?

我感兴趣的是这在理论上是否可行,我没有这方面的实际用例

推荐答案

Section 4.5.1 of the JLS指定通用通配符的语法:

TypeArguments:
  < TypeArgumentList >
TypeArgumentList:
  TypeArgument {, TypeArgument}
TypeArgument:
  ReferenceType
  Wildcard
Wildcard:
  {Annotation} ? [WildcardBounds]
WildcardBounds:
  extends ReferenceType
  super ReferenceType

在这里,WildcardBounds写在方括号中.在Section 2.4 of the JLS中,解释了在这种情况下,方括号表示只能放置一次的可选元素:

产品右侧的语法[x]表示x的零次或一次出现.也就是说,x是可选符号.包含可选符号的替代方案实际上定义了两个替代方案:一个省略可选符号,另一个包含可选符号.

对于有界泛型通配符,这意味着只允许一个通配符界.

Java相关问答推荐

如何在Spring Boot中创建500错误的响应正文?

使用Apache Poi MQLSlideShow,在XSLFTable表中,我们可以在文本段落后面的每个单元格中包含圆角矩形吗?

JPackaged应用程序启动MSI调试,然后启动System. exit()

ApachePOI:不带换行的新行

如何找到MongoDB文档并进行本地化?

无法初始化JPA实体管理器工厂:无法确定为Java类型<;类>;推荐的JdbcType

JOOQ中的子查询使用的是默认方言,而不是配置的方言

用OSQL创建索引

Log4j与jdk21兼容吗?

在Frege中,我如何将一个字符串安全地转换为一个可能的Int?

根本不显示JavaFX阿拉伯字母

有谁能帮我修一下这个吗?使输出变得更加整洁

为什么在下面的Java泛型方法中没有类型限制?

Domino中不同的java.Protocol.handler.pkgs设置在XPages Java中导致错误

Spring Validator批注不起作用

将BlockingQueue+守护程序线程替换为执行器

活泼的一次判断成语,结果中等

使用Java线程进行并行编程

ReturnedRect在升级后反转

SonarQube在合并升级到java17后对旧代码提出错误