Java中的Union Types和Intersection Types

Posted yaigu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的Union Types和Intersection Types相关的知识,希望对你有一定的参考价值。

前言

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

以上是关于Java中的Union Types和Intersection Types的主要内容,如果未能解决你的问题,请参考以下文章

[TypeScript] Model Alternatives with Discriminated Union Types in TypeScript

PHP 8确认引入Union Types 2.0

[TypeScript] Typescript Interfaces vs Aliases Union & Intersection Types

[GraphQL] Query Lists of Multiple Types using a Union in GraphQL

MySQL 5.6比较重要的参数,以及5.5到5.6默认值有过变化的参数

Union集基于Java中的Intersection