Java 你能指定一个泛型类型,它是另一个泛型类型和一个具体接口的子类吗?

Java 你能指定一个泛型类型,它是另一个泛型类型和一个具体接口的子类吗?,java,generics,Java,Generics,我有一个域模型家族,每个域模型都有一个子类来扩展它并实现一个特定的接口,就像这样(Cloneable不是所讨论的接口,只是出于示例目的): 我想创建一个通用类型签名来强制执行此配对,我已经尝试了失败的: <T1,T2 extends T1 & Cloneable> void f ( T1 t1, T2 t2 ){} <T extends A & Cloneable> void f( A a, T t ){} <T1,T2 extends T1>

我有一个域模型家族,每个域模型都有一个子类来扩展它并实现一个特定的接口,就像这样(
Cloneable
不是所讨论的接口,只是出于示例目的):

我想创建一个通用类型签名来强制执行此配对,我已经尝试了失败的

<T1,T2 extends T1 & Cloneable> 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 ){}
我收到消息
“此处需要接口。”

令人困惑的是,这两个签名都起作用了:

<T1,T2 extends T1 & Cloneable> 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 ){}
void f(aa,tt){
空位f(T1,T2){}
这只是Java泛型类型系统的一个奇怪的限制吗?我不能让泛型类(即
T2
)同时扩展另一个泛型类(即
T1
)和一个具体接口(例如
Cloneable

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

答案是:

&Cloneable
是一个AdditionalBound,只能在AdditionalBoundList中使用。AdditionalBoundList只能在ClassOrInterfaceType之后使用。而
T1
是一个类型变量,而不是类或接口类型

所以,是的,这是Java通用语法的一个限制

void f(T1 T1,t2t2){}

我得到消息“这里需要接口。”

每个声明为类型参数的类型变量都有一个边界。如果没有 为类型变量声明绑定,假定为对象。如果是束缚 声明时,它由以下任一部分组成:

- a single type variable T, or

- a class or interface type T possibly followed by interface types `I1 & ... & In`.
如果任何类型
I1。。。在
中是一个 类型或类型变量


因此,对于表达式
无效测试(T)
I
应该是一个接口

是的,这是Java类型的另一个奇怪而不幸的限制,如果涉及类型变量,就不能执行交叉点类型约束。给出的理由显然是为了避免“某些有问题的情况”。@PaulBellora虽然答案可能是相同的,但我的问题与两个接口中的一个不同。@Judgential它似乎可以在编译时进行检查,所以我真的很想了解实际涉及的细节。@ArtB查看对该问题的编辑(有悬赏)还有我的答案。我知道这有点让人困惑。第二个链接帖子显然是重复的。
I
在原始问题中是
Cloneable
,这是一个界面。问题出在
C
,它必须是一个类或接口(但不是一个类型变量)。@yshavit,请看一下我答案的开头,在那里我引用了他的一个问题。他实际上有两个问题。我用
>
code by粘贴了问题,用
别这样,我不能正确粘贴是我的错:)
- a single type variable T, or

- a class or interface type T possibly followed by interface types `I1 & ... & In`.