Intersection Type
直译是叫交集类型,语法:&
示例写法
public class MyClass {
public void hello() {
System.out.println("hello");
}
}
interface MyInteface {
// ...
default void world() {
System.out.println(" world");
}
}
interface MyInteface2 {
// ...
default void intersection() {
System.out.println(" intersection");
}
}
/**
* 交集类型
*/
public class MyIntersection extends MyClass implements MyInteface, MyInteface2 {
// ...
}
/**
* 只能用于类上、方法上的泛型声明,实例化时不能使用&
*
* @param <T>
*/
class MyCat<T extends MyClass & MyInteface & MyInteface2> {
T t;
public MyCat(T t) {
this.t = t;
}
T getIntersection() {
return this.t;
}
}
@Test
void testIntersection2() {
MyIntersection myIntersection = new MyIntersection();
MyCat<MyIntersection> myCat = new MyCat<>(myIntersection); // OK
myCat.getIntersection().hello();
myCat.getIntersection().world();
myCat.getIntersection().intersection();
MyCat<MyClass> myCat2 = new MyCat<>(); // compile error
MyCat<MyInteface> myCat3 = new MyCat<>(); // compile error
}
MyCat<T extends MyClass & MyInteface>
即申明一个带泛型的交集类型,含义是T extends MyClass & MyInteface
含义是,T既是MyClass的子类,也是MyInteface的子类,T同时拥有MyClass、MyInteface的所有行为。
这明明是MyClass、MyInteface的并集,为啥叫intersection type?因为T
不是为了说明T
有哪些行为,而是为了表达T
的可选类型被限定在得兼具两种类型,可选类型范围变小,符合数学里的交集的含义。