我有一系列域模型,每个模型都有一个扩展它并实现特定接口的子类,如下所示(Cloneable
不是有问题的接口,仅用于示例目的):
class A{}
class B extends A implements Cloneable{}
class C{}
class D extends C implements Cloneable{}
我想创建一个通用类型签名来强制执行这种配对,我已经尝试过这个FAILS:
<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
)和具体接口(例如Cloneable
)?
tl; dr:那么,为什么不<T1,T2 extends Cloneable & T1> void f ( T1 t1, T2 t2 ){}
编译:这是 Java 通用语法的限制还是我使用了错误的语法?