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
的可選型別被限定在得兼具兩種型別,可選型別範圍變小,符合數學裡的交集的含義。