Java 泛型:具有类型参数的多个边界

Java generics: Multiple bounds with type parameter

编译以下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> {}

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

据我了解,如果声明了多个边界,其中最多可能是一个class(其他都是接口),并且它必须是第一个。

但是,因为在我的示例中 Interface 是一个接口,为什么编译器会报错?毕竟,T 是接口还是 class.

应该没有任何区别

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

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