背景:測試
在子類中想鏈式調用設值(或者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()); } }