泛型
在java1.5之前是没有泛型 List集合使用是Object对象。
这样任何类型数据都可以存储,取出。
但是这样写会出现两个问题:
1.当存储时,集合不会记住类型,所以当取出时也会变成 Object。
2.运行时就会强制类型转换,这样就有很大可能出现 java.lang.ClassCaseException。
泛型的好处:
1.可读性变高;
2.安全性提高,在代码编译前就会提前得知错误,而不是编译后出现,ClassCaseException。
3.优化,维护时方便。
泛型格式:
显示指定自己的类型参数将"<>"放在构造器之前
"<>"菱形放在构造器后面表示指定类型实参数
通配符
通配符的元素可以匹配任何类型。
但是不能把元素加入到集合中,因为无法匹配到元素类型。
通配符的目的是用来限制泛型的类型参数的类型,使其满足某种条件,固定为某些类。
分为:1.上限通配符;2.下限通配符
上限通配符:
使用关键字extends来实现。
private static void upWildcard() {
List<Dog> dogs = new ArrayList<>();
Dogdog = new Animal();
dog.setVoice("Woo Woo Woo");
dog.setName("小白");
dog.setColor("White");
dogs.add(dog);
animal(dogs);
}
private static void animal(List<? extends Dog> dogs) {
for (Dog dog : dogs) {
System.out.println(dog.getVoice() + ",\n" +
"name = " + dog.getName() + "\n" +
"color = " + dog.getColor());
}
}
下限通配符:
使用关键字 super来实现
private static void upWildcard() {
List<Animal> dogs = new ArrayList<>();
Animal dog = new Animal();
dog.setName("小白");
dog.setColor("White");
dogs.add(dog);
superAnima(dogs);
}
private static void superAnima(List<? super Dog> animal){
for (Object o : animal) {
Dog dog = (Dog) o;
System.out.println(dog.getVoice() + ",\n" +
"name = " + dog.getName() + "\n" +
"color = " + dog.getColor());
}
}