Java 7交集类型:规范究竟说​​了什么?

时间:2014-05-20 11:58:51

标签: java types java-7 intersection jls

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类型如下:

  • J1&lt;:I1
  • J3&lt;:J2

现在,我需要一个Tk&lt;:Ck,其中Ck&lt ;: C1和Ck&lt;:C2,但如果Ck:= C1,则I1&lt;:J2为假,如果Ck: = C2,然后J2&lt;:I1为假。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:4)

您似乎混淆了<:<。如果您阅读有关子类型的下一部分,您将看到<:对于类本身有效 - 换句话说,对于任何类型T,T <: T都是真的。这与用于严格子类化的<相反(T < T始终为false)。

在你的例子中:

  • T1 == C1 == J1
  • T2 == C2 == J2
  • Tk == Ck == C

您可以验证C <: J1C <: J2

所以一切都很好。