Java中的Union Types和Intersection Types
Posted yaigu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的Union Types和Intersection Types相关的知识,希望对你有一定的参考价值。
前言
Union Type和Intersection Type都是将多个类型结合起来的一个等价的“类型”,它们并非是实际存在的类型。
Union Type
Union type(联合类型)使用比特或运算符|
进行构造:
A | B | C
注意:用
|
符号来构造Union Type类型只是Java语言的规定,|
在这里不代表比特或的含义。
上例中,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
中每一个的相关成员都继承过来了
注意:在
Type1 & Type2 & Type3 & ... & Type n
中,必须满足:至少有n-1
个接口,如果有1个类必须放在一开始。
实例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
以上是关于Java中的Union Types和Intersection Types的主要内容,如果未能解决你的问题,请参考以下文章
[TypeScript] Model Alternatives with Discriminated Union Types in TypeScript
[TypeScript] Typescript Interfaces vs Aliases Union & Intersection Types
[GraphQL] Query Lists of Multiple Types using a Union in GraphQL