您可以通过限制类定义中的类型来限制通用类中使用的有效类型。给定以下简单的类型层次结构:
public abstract class Animal { public abstract String getSound(); } public class Cat extends Animal { public String getSound() { return "Meow"; } } public class Dog extends Animal { public String getSound() { return "Woof"; } }
如果没有有界的泛型,我们就不能创建既是泛型又知道每个元素都是动物的容器类:
public class AnimalContainer<T> { private Collection<T> col; public AnimalContainer() { col = new ArrayList<T>(); } public void add(T t) { col.add(t); } public void printAllSounds() { for (T t : col) { // 非法,类型T没有makeSound() // 它在这里用作java.lang.Object System.out.println(t.makeSound()); } } }
通过类定义中的泛型绑定,现在可以做到这一点。
public class BoundedAnimalContainer<T extends Animal> { // 请注意此处。 private Collection<T> col; public BoundedAnimalContainer() { col = new ArrayList<T>(); } public void add(T t) { col.add(t); } public void printAllSounds() { for (T t : col) { // 现在有效,因为T正在扩展Animal System.out.println(t.makeSound()); } } }
这也限制了泛型类型的有效实例化:
// 法律 AnimalContainer<Cat> a = new AnimalContainer<Cat>(); // 法律 AnimalContainer<String> a = new AnimalContainer<String>();
// 法律 because Cat extends Animal BoundedAnimalContainer<Cat> b = new BoundedAnimalContainer<Cat>(); // 非法,因为String不能扩展Animal BoundedAnimalContainer<String> b = new BoundedAnimalContainer<String>();