Java泛型裡的Intersection Type

漠孤烟發表於2024-08-21

Intersection Type

直譯是叫交集型別,語法:&

示例寫法

    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的可選型別被限定在得兼具兩種型別,可選型別範圍變小,符合數學裡的交集的含義。

相關文章