Java泛型里的Intersection Type

Intersection Type

交叉类型,语法:Type1 & Type2

示例写法

    public class MyClass {
        public void hello() {
            System.out.println("hello");
        }
    }

    interface MyInteface {
        // ...
        default void world() {
            System.out.println(" world");
        }
    }

    interface MyInteface2 {
        // ...
        default void intersection() {
            System.out.println(" intersection");
        }
    }

    public class MyIntersection extends MyClass implements MyInteface, MyInteface2 {
        // ...
    }

    /**
     * 泛型里的交叉类型,只能用于类上、方法上的泛型声明,实例化时不能使用&
     *
     * @param <T>
     */
    class MyCat<T extends MyClass & MyInteface & MyInteface2> {
        T t;
        public MyCat(T t) {
            this.t = t;
        }

        T getIntersection() {
            return this.t;
        }
    }

    @Test
    void testIntersection2() {
        MyIntersection myIntersection = new MyIntersection();
        MyCat<MyIntersection> myCat = new MyCat<>(myIntersection); // OK
        myCat.getIntersection().hello();
        myCat.getIntersection().world();
        myCat.getIntersection().intersection();
        MyCat<MyClass> myCat2 = new MyCat<>(); // compile error
        MyCat<MyInteface> myCat3 = new MyCat<>(); // compile error
    }

MyCat<T extends MyClass & MyInteface>即申明一个带泛型的交叉类型,T extends MyClass & MyInteface含义是:T既要是MyClass的子类,也要是MyInteface的子类,T同时拥有MyClass、MyInteface的所有行为。
这看起来是取MyClass、MyInteface的并集,为啥叫intersection type?因为T不是为了说明T有哪些行为,而是为了表达T的可选类型被限定在得兼具两种类型,T的可选类型范围变小,符合数学里的交叉(交集)的含义。

Java函数式编程里的交叉类型

可用于只要入参和返回类型匹配一样的函数就可以做cast类型转换

        Serializable ser = (Serializable & Calculator) Long::sum;
        System.out.println(ser instanceof Serializable);
        System.out.println(ser instanceof Calculator);

        Runnable job = (Runnable & Serializable) () -> System.out.println("Hello");
        Class<?>[] interfaces = job.getClass().getInterfaces();
        for (Class<?> i : interfaces) {
            System.out.println(i.getSimpleName());
        }

输出:

true
true
Runnable
Serializable
posted @   漠孤烟  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示