java - 你能指定一个泛型类型来子类化另一个泛型类型_和_一个具体的接口(interface)吗?

标签 java generics

我有一个领域模型家族,每个领域模型都有一个扩展它的子类并且实现一个特定的接口(interface),就像这样(Cloneable 不是有问题的接口(interface),它只是为了举例仅):

class A{}
class B extends A implements Cloneable{}

class C{}
class D extends C implements Cloneable{}

我想创建一个通用类型签名来强制执行此配对,我试过这个失败:

<T1,T2 extends T1 & Cloneable> void f ( T1 t1, T2 t2 ){}

但我在 IntelliJ IDE 中收到消息 "Type parameter cannot be followed by other bounds" ;如果我将顺序切换为:

,它仍然失败
<T1,T2 extends Cloneable & T1> void f ( T1 t1, T2 t2 ){}

我收到消息 "Interface expected here."

令人困惑的是,这两个签名都有效:

<T extends A & Cloneable> void f( A a, T t ){}
<T1,T2 extends T1> void f ( T1 t1, T2 t2 ){}

这是否只是 Java 泛型类型系统的一个奇怪限制,我不能让泛型类​​(即 T2)同时扩展另一个泛型类(即T1) 一个具体的接口(interface)(例如 Cloneable )?

tl;dr:那么,为什么不 <T1,T2 extends Cloneable & T1> void f ( T1 t1, T2 t2 ){}编译:这是 Java 通用语法的限制还是我使用了错误的语法?

最佳答案

答案在JLS 4.4中:

TypeParameter:
    TypeVariable TypeBoundopt

TypeBound:
    extends TypeVariable
    extends ClassOrInterfaceType AdditionalBoundListopt

AdditionalBoundList:
    AdditionalBound AdditionalBoundList
    AdditionalBound

AdditionalBound:
    & InterfaceType

&Cloneable是一个AdditionalBound,只能在AdditionalBoundList中使用。 AdditionalBoundList 只能在 ClassOrInterfaceType 之后使用。 T1 是一个 TypeVariable,而不是一个 ClassOrInterfaceType。

所以,是的,这是 Java 泛型语法的限制。

关于java - 你能指定一个泛型类型来子类化另一个泛型类型_和_一个具体的接口(interface)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19984305/

相关文章:

java - 字符串格式查询

java - 如何使用 MethodDelegation 或 Forwarding 创建 Byte Buddy 代理?

Java Generic和Generic Class的继承

Java 泛型 - 太复杂?如何简化?

java - 如何在 spring security 中重定向访问被拒绝的页面?

java - 没有spring-framework@Resource注解能正常使用吗?

java - 查找计算机中运行的应用程序

C++ 创建一个具有可变模板方法的接口(interface)

reactjs - 在通用函数中使用 React.ComponentProps

generics - Kotlin 泛型更改返回类型