【发布时间】:2013-11-27 20:32:43
【问题描述】:
我有一系列领域模型,每个模型都有一个扩展它的子类并且实现了一个特定的接口,就像这样(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."
令人困惑的是,这两个签名WORK:
<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 泛型语法的限制还是我使用了错误的语法?
【问题讨论】:
-
是的,Java 类型的另一个奇怪而不幸的限制是,如果涉及类型变量,则不能进行交集类型约束。给出的理由显然是为了避免“某些有问题的情况”。
-
@PaulBellora 虽然答案可能相同,但我的问题与两个界面之一不同。
-
@JudgeMental 似乎编译时间可以检查,所以我真的会对所涉及的实际细节感到好奇。
-
@ArtB 查看对该问题的编辑(有赏金)和我的回答。我知道这有点令人困惑。第二个链接的帖子更明显是重复的。