在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的通用性和可重用性。