编译以下Java代码:

interface Interface1{}
interface Interface2{}
class MyClass1<T extends Interface1 & Interface2>{}

此外,还编译了以下代码:

class AClass{}
interface Interface3{}
class MyClass2<T extends AClass & Interface3>{}

以下代码将给我一个编译错误:

interface Interface4 {}
class MyClass3<T, S extends T & Interface4> {}

因此,看起来,如果其中一个边界类型本身是类型参数,就不可能有多个边界.但为什么呢?

据我所知,如果声明了多个边界,那么最多一个边界可能是一个类(其他所有边界都是接口),并且它必须是第一个边界.

但是,既然在我的例子中Interface是一个接口,为什么编译器会抱怨呢?毕竟,t是接口还是类都不应该有任何区别.

我试图在网上找到答案,但显然我的谷歌搜索能力还不够.我很想了解这里发生了什么.

推荐答案

Java语言规范的第4.4节似乎明确不允许这样做.类型绑定被指定为:

TypeBound:
   extends TypeVariable
   extends ClassOrInterfaceType {AdditionalBound}

AdditionalBound:
   & InterfaceType

所以看起来你可以指定一个类型变量("T"),或者你可以有一个类和接口的列表,但是你不能混合使用它们.

https://docs.oracle.com/javase/specs/jls/se18/html/jls-4.html#jls-4.4

Java相关问答推荐

当切换javaFX场景时,stage的大小正在Minimize

Java Stream,需要更新列表对象列表

如何使用AWS CLI从S3存储桶中的所有对象中删除用户定义的元数据?

我找不到&Quot;配置&的位置

如何创建同一类的另一个对象,该对象位于变量中?

蒙蒂霍尔比赛结果不正确

Spring data JPA/Hibernate根据id获取一个列值

使用PDFBox从PDF中删除图像

解析方法";javax/imageio/metadata/IIOMetadata.getAsTree(Ljava/lang/String;)Lorg/w3c/dom/Node时加载约束冲突

使用htmlunit和java单击按钮

对从Spring Boot 3.1.5升级到3.2.0的方法的查询验证失败

为什么项目名称出现在我的GET请求中?

处理4.3问题:javax.xml.ind包不存在(&Q;).您可能在学习GitHub教程时遗漏了库.&Q

如何制作回文程序?

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

在具有Quarkus Panache的PostgreSQL中将JSON数据存储为JSONB时,会将其存储为转义字符串

PhantomReference无法访问时会发生什么?

如何判断元素计数并在流的中间抛出异常?

如何使用stream.allMatch()为空流返回false?

如何转换Vector<;对象>;转换为int?