From Gossip@caterpillar

Java Gossip: 擴充泛型類別、實作泛型介面

您可以擴充一個泛型類別,保留其型態持有者,並新增自己的型態持有者,例如先寫一個父類別:
  • GenericFoo.java
public class GenericFoo<T1, T2> {
private T1 foo1;
private T2 foo2;

public void setFoo1(T1 foo1) {
this.foo1 = foo1;
}

public T1 getFoo1() {
return foo1;
}

public void setFoo2(T2 foo2) {
this.foo2 = foo2;
}

public T2 getFoo2() {
return foo2;
}
}

再來寫一個子類別擴充上面的父類別:
  • SubGenericFoo.java
public class SubGenericFoo<T1, T2, T3> 
extends GenericFoo<T1, T2> {
private T3 foo3;

public void setFoo3(T3 foo3) {
this.foo3 = foo3;
}

public T3 getFoo3() {
return foo3;
}
}

如果決定要保留型態持有者,則父類別上宣告的型態持有者數目必須齊全,也就是說上式中,T1與T2都要出現,如果不保留型態持有者,則繼承下來的T1與 T2自動變為Object,建議當然是父類別的型態持有者都保留。

介面實作也是類似,例如先定義一個介面:

  • IFoo.java
public interface IFoo<T1, T2> {
public void setFoo1(T1 foo1);
public void setFoo2(T2 foo2);
public T1 getFoo1();
public T2 getFoo2();
}

實作時如下,保留所有的型態持有者:
  • GenericFoo.java
public class GenericFoo<T1, T2> implements IFoo<T1, T2> {
private T1 foo1;
private T2 foo2;

public void setFoo1(T1 foo1) {
this.foo1 = foo1;
}

public T1 getFoo1() {
return foo1;
}

public void setFoo2(T2 foo2) {
this.foo2 = foo2;
}

public T2 getFoo2() {
return foo2;
}
}