我有一组领域模型,每个模型都有一个子类来扩展它并实现特定的接口,就像这样(Cloneable
不是问题中的接口,只是举例):
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中,我收到了一条消息:"类型参数后不能跟其他边界"
;如果我改变顺序为:
"其他边界不能跟随类型参数"
它仍然失败。
<T1,T2 extends Cloneable & T1> void f ( T1 t1, T2 t2 ){}
我收到了消息"这里需要接口."
令人困惑的是,这两个签名都可以使用:
<T extends A & Cloneable> void f( A a, T t ){}
<T1,T2 extends T1> void f ( T1 t1, T2 t2 ){}
这只是Java泛型类型系统的奇怪限制吗?我不能有一个泛型类(即T2
)既扩展另一个泛型类(即T1
),又扩展一个具体接口(例如Cloneable
)吗?
简而言之:为什么<T1,T2 extends Cloneable& T1> void f(T1 t1,T2 t2){}
无法编译:这是Java泛型语法的限制还是我使用了错误的语法?