http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.9
对于每个Ti(1≤i≤n),让Ci成为最具体的类或数组类型,使得Ti <: Ci。然后必须存在一些Tk <: Ck,使得Ck <: Ci对于任何i(1≤i≤n),否则会出现编译时错误。
对于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 <: Ci类型如下:
- J1 <: I1
- J3 <: J2
这里我漏掉了什么?
A<T extends String & List>
这样的东西不会编译(因为String是final类型,且没有实现List接口),但在jdk 8上它仍然可以编译通过。所以其实我也不确定... - assylias