Java中的Union Types和Intersection Types
程序员文章站
2022-06-21 13:32:02
前言 Union Type 和 Intersection Type 都是将多个类型结合起来的一个 等价的“类型” ,它们 并非是实际存在 的类型。 Union Type Union type(联合类型) 使用比特或运算符 进行构造: 注意: 用 符号来构造Union Type类型只是Java语言的规 ......
前言
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