欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java中的Union Types和Intersection Types

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

前言

union typeintersection type都是将多个类型结合起来的一个等价的“类型”,它们并非是实际存在的类型。

union type

union type(联合类型)使用比特或运算符|进行构造:

a | b | c

注意:|符号来构造union type类型只是java语言的规定,|在这里不代表比特或的含义。

上例中,a | b | c是一个union typeunion 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,它兼具myamyb的特征,因此可以将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