泛型,简单来说,就是参数化类型。在没有泛型之前,我们编写的代码往往只能处理特定类型的数据。例如,一个存储整数的列表就只能存储整数,无法存储其他类型的数据。而泛型允许我们在定义类、接口或方法时,使用类型参数来表示数据类型,这样在使用这些类、接口或方法时,可以指定具体的类型。
泛型的通配符(限制类型的范围):
上界通配符(? extends T
)
上界通配符用 ? extends T 表示,它表示通配符所代表的类型是 T 类型或者 T 的子类。
import java.util.ArrayList;
import java.util.List;class Fruit {public void eat() {System.out.println("Eating a fruit");}
}class Apple extends Fruit {@Overridepublic void eat() {System.out.println("Eating an apple");}
}public class UpperBoundedWildcard {public static void eatFruits(List<? extends Fruit> fruits) {for (Fruit fruit : fruits) {fruit.eat();}}public static void main(String[] args) {List<Apple> apples = new ArrayList<>();apples.add(new Apple());eatFruits(apples);}
}
下界通配符(? super T
)
下界通配符用 ? super T
表示,它表示通配符所代表的类型是 T
类型或者 T
的父类。
import java.util.ArrayList;
import java.util.List;class Animal {public void sleep() {System.out.println("Animal is sleeping");}
}class Dog extends Animal {@Overridepublic void sleep() {System.out.println("Dog is sleeping");}
}public class LowerBoundedWildcard {public static void addDogs(List<? super Dog> dogList) {dogList.add(new Dog());}public static void main(String[] args) {List<Dog> dogList = new ArrayList<>();addDogs(dogList);List<Animal> animalList = new ArrayList<>();addDogs(animalList);}
}