http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.9
对于每个Ti(1≤i≤n),令Ci是最特定的类或阵列类型,使得Ti <:Ci。然后必须有一些Tk&lt;:Ck,这样任何i(1≤i≤n)的Ck&lt;:Ci,或者发生编译时错误。
对于1≤j≤n,如果Tj是一个类型变量,那么让Tj'成为一个接口,其成员与Tj的公共成员相同;否则,如果Tj是一个接口,那么让Tj'为Tj。
然后交集类型与类类型(§8)具有相同的成员,具有空体,直接超类Ck和直接超接口T1',...,Tn',在同一个包中声明交叉点类型出现。
我原本期望以下代码导致编译时错误,但它不会:
public interface I1 {}
public interface J1 extends I1 {}
public interface J2 {}
public interface J3 extends J2 {}
class C implements J1, J3 {}
public class A<T extends J1 & J3> {
public static void main(String[] args) {
A<C> a = new A<>();
}
}
据我所知,Ti&lt;:Ci类型如下:
现在,我需要一个Tk&lt;:Ck,其中Ck&lt ;: C1和Ck&lt;:C2,但如果Ck:= C1,则I1&lt;:J2为假,如果Ck: = C2,然后J2&lt;:I1为假。
我在这里缺少什么?
答案 0 :(得分:4)
您似乎混淆了<:
和<
。如果您阅读有关子类型的下一部分,您将看到<:
对于类本身有效 - 换句话说,对于任何类型T,T <: T
都是真的。这与用于严格子类化的<
相反(T < T
始终为false)。
在你的例子中:
T1 == C1 == J1
T2 == C2 == J2
Tk == Ck == C
您可以验证C <: J1
和C <: J2
。
所以一切都很好。