From Gossip@caterpillar

Java Gossip: 限制泛型可用類型

在定義泛型類別時,預設您可以使用任何的型態來實例化泛型類別中的型態持有者,但假設您想要限制使用泛型類別時,只能用某個特定型態或其子類別才能實例化型態持有者的話呢?

您可以在定義型態持有者時,一併使用"extends"指定這個型態持有者必須是擴充某個類型,舉個實例來說:

  • ListGenericFoo.java
import java.util.List;

public class ListGenericFoo<T extends List> {
private T[] fooArray;

public void setFooArray(T[] fooArray) {
this.fooArray = fooArray;
}

public T[] getFooArray() {
return fooArray;
}
}

ListGenericFoo在宣告類型持有者時,一併指定這個持有者必須擴充自List介面(interface),在限定持有者時,無論是要限定的對 象是介面或類別,都是使用"extends"關鍵字。

您使用"extends"限定型態持有者必須是實作List的類別或其子類別,例如LinkedList與ArrayList,下面的程式是合法的:
ListGenericFoo<LinkedList> foo1 =
                  new ListGenericFoo<LinkedList>();
ListGenericFoo<ArrayList> foo2 =
                  new ListGenericFoo<ArrayList>();
 

但是如果不是List的類別或是其子類別,就會發生編譯錯誤,例如下面的程式通不過編譯:
ListGenericFoo<HashMap> foo3 =
                  new ListGenericFoo<HashMap>();
 

編譯器會回報以下錯誤訊息:
type parameter java.util.HashMap is not within its bound
ListGenericFoo<HashMap> foo3 = new ListGenericFoo<HashMap>();

HashMap並沒有實作List介面,所以無法用來實例化型態持有者,事實上,當您沒有使用extends關鍵字限定型態持有者時,預設則是Object下的所有子類別都可以實例化型態持有者,即只寫<T>時就相當於<T extends Object>