java 抽象父類方法返回子類的類型

背景:測試

在子類中想鏈式調用設值(或者builder模式),而有些屬性在父類,有些在子類, 傳統的方式須要在子類進行強制轉換,而強制轉換有影響鏈式調用。ui

例如:this

父類:spa

public abstract class P {
    private String a;
    private String b;
    public String getA() {
        return a;
    }
    public P setA(String a) {
        this.a = a;
        return this;
    }
    public String getB() {
        return b;
    }
    public P setB(String b) {
        this.b = b;
        return this;
    }
}

子類:code

public class S extends P {
    private String c;
    private String d;
    public String getC() {
        return c;
    }
    public S setC(String c) {
        this.c = c;
        return this;
    }
    public String getD() {
        return d;
    }
    public S setD(String d) {
        this.d = d;
        return this;
    }
}

測試:blog

   S s = new S();
   s.setC("c").setD("d").setA("a").setB("b");

   //compile error
   s.setA("a").setB("b").setC("c");

 

碰到這種狀況, 泛型就能夠起做用了, 可讓父類方法返回子類的類型get

 

父類:class

public abstract class Parent<E extends Parent<E>> {

    private String a;

    public E setA(String a) {
        this.a = a;
        return this.self();
    }

    public String getA() {
        return a;
    }

    public E self(){
        return (E)this;
    }
}

子類:泛型

public class Son extends Parent<Son> {

    private String b;

    public Son setB(String b) {
        this.b = b;
        return this;
    }

    public String getB() {
        return b;
    }

    public static void main(String[] args) {
        Son son = new Son();
        son.setA("a").setB("b");
        System.out.println(son.getA()+" "+son.getB());
    }
}
相關文章
相關標籤/搜索