大可制作:QQ群:31564239(asp|jsp|php|mysql)

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>