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