在Java中,有限制通配符(bounded wildcard)允许你在泛型中指定一个范围,从而提升API的灵活性。通配符使得你能够编写更通用、适用于多种类型的代码。以下是一个利用有限制通配符提升API灵活性的例子:
假设有一个简单的动物类层次结构:
class Animal {// 省略其他属性和方法
}class Dog extends Animal {// 省略其他属性和方法
}class Cat extends Animal {// 省略其他属性和方法
}
现在,考虑一个包含动物的容器类:
import java.util.List;class AnimalContainer {// 将动物添加到容器中public void addAnimals(List<? extends Animal> animals) {// 执行添加操作}// 获取容器中的动物public void getAnimals(List<? super Animal> output) {// 执行获取操作}
}
在这个例子中,addAnimals
方法使用了有限制通配符 <? extends Animal>
,表示该方法可以接受任何继承自Animal
的类型的列表。这使得可以将Dog
、Cat
等子类的列表都传递给该方法,提高了灵活性。
而getAnimals
方法使用了超类型通配符 <? super Animal>
,表示该方法可以接受任何Animal
的超类型的列表。这意味着可以将Object
、Animal
等更泛化的类型的列表传递给该方法。
import java.util.ArrayList;
import java.util.List;public class Example {public static void main(String[] args) {AnimalContainer container = new AnimalContainer();List<Dog> dogs = new ArrayList<>();dogs.add(new Dog());dogs.add(new Dog());List<Cat> cats = new ArrayList<>();cats.add(new Cat());cats.add(new Cat());// 添加狗到容器container.addAnimals(dogs);// 添加猫到容器container.addAnimals(cats);// 获取动物到容器List<Animal> outputAnimals = new ArrayList<>();container.getAnimals(outputAnimals);// 可以将结果输出到任何 Animal 或其父类的列表中}
}
通过使用有限制通配符,AnimalContainer
类的方法变得更加灵活,可以接受不同子类型的动物列表,同时也可以将动物的列表输出到更泛化的类型中。这种方式提高了API的通用性和可重用性。