前言
Union Type和Intersection Type都是将多个类型结合起来的一个等价的“类型”,它们并非是实际存在的类型。
Union Type
Union type(联合类型)使用比特或运算符|
进行构造:
A | B | C
上例中,A | B | C
是一个Union type,Union type的含义就是“或”,只要满足其中一个即可。
实例:捕获多个异常中的一个
try {
// ...
} catch (ExceptionA | ExceptionB e) {
}
就等价于:
try {
// ...
} catch (ExceptionA e) {
} catch (ExceptionB e) {
}
Intersection Type
Intersection type(交集类型)使用比特与运算符&
进行:
A & B & C
Intersection type(交集类型),虽然名称翻译过来是“交集”,但是Intersection type并非数学上的交集含义。A & B & C
的含义是:该交集类型兼具A、B、C
的特征,相当于把A、B、C
中每一个的相关成员都继承过来了
实例1:泛型类
class MyA {
}
interface MyB {
}
class Combination extends MyA implements MyB {
}
class MyC<T extends MyA & MyB> {
}
public class Test {
public static void main(String[] args) {
// new MyC<MyA & MyB>(); 报错, <>内不能用Intersection Type
new MyC<Combination>(); // OK
}
}
如何理解<T extends MyA & MyB>
呢?可以将MyA & MyB
等价为一个类型U
,它兼具MyA
和MyB
的特征,因此可以将Combanation
类作为MyC
的类型参数。
实例2:对Lambda表达式进行强制类型转换
public class Test {
public static void main(String[] args) {
Runnable job =(Runnable & Serializable) () ->System.out.println("Hello");
Class[] interfaces = job.getClass().getInterfaces();
for (Class i : interfaces) {
System.out.println(i.getSimpleName());
}
}
}
/*
Runnable
Serializable