泛型中的自限定型別

奮鬥的小青年_發表於2017-01-15

自限定型別強制泛型當做其自己的邊界引數來使用。

package a;

/**
 * Created by msc on 2017/1/15.
 */
class SelfBounded<T extends SelfBounded<T>>{
    T element;
    SelfBounded<T> set(T arg){
        element=arg;
        return this;
    }
    T get(){return element;}
}

class A extends SelfBounded<A>{}
class B extends SelfBounded<A>{}
class C extends SelfBounded<C>{
    C setAndGet(C arg){
        set(arg);
        return get();
    }
}
class D{}

//因為類D沒有繼承SelfBounded,所以該類編譯失敗。
//class E extends SelfBounded<D>{}

class SelfBounding {
    public static void main(String[] args) {
        A a=new A();
        a.set(new A());
        a=a.set(new A()).get();
        a=a.get();
        C c=new C();
        c=c.setAndGet(new C());
    }
}

自限定所做的就是要求在繼承關係中,強制要求將正在定義的類當做引數傳遞給基類。

自限定引數據有何意義呢?它可以保證型別引數必須與正在被定義的類相同,還可以使用另一個繼承了SelfBounded的子類作為引數。但是讓引數與正在被定義的類相同是主要用法。



相關文章