java韩顺平学习笔记9 (泛型)
泛型的理解和好处
引出泛型
如果集合中,不小心添加了一只猫对象,会导致运行时程序出错。
泛型的好处
public static void main(String[] args) {
ArrayList<Dog> arrayList = new ArrayList()<Dog>;
arrayList.add(new Dog(5,"小黑","黑色"));
arrayList.add(new Dog(5,"旺财","白色"));
arrayList.add(new Dog(6,"小黄","黄色"))
//不小心添加了一只猫
//arrayList.add(new Cat("tom",10,"蓝色"));
for (Dog dog :arrayList) { //直接取出Dog类型,不必转换
System.out.println(dog); //遍历输出
}
}
class Person<E>{
E s; //E表示s的数据类型,E的数据类型在定义Person对象时确定
public Person(E s){
this.s = s;
}
public E f1(){ //定义f1返回的数据类型为E
return s;
}
}
- 泛型类型参数不能是原始数据类型,而应该是对象
泛型应用实例(Map)
public static void main(String[] args) {
Map<String,Person> hashmap = new HashMap<String, Person>(); //泛型规定K是String
//V是Person
hashmap.put("lulu",new Person("lulu",23));
hashmap.put("hh",new Person("hh",11));
hashmap.put("aa",new Person("aa",13));
Set<Map.Entry<String,Person>> entries = hashmap.entrySet();
for (Map.Entry entry :entries) {
System.out.println(entry.getKey() + "--" + entry.getValue());
}
}
泛型使用细节
- 可以简化右边的 <>
自定义泛型类
自定义泛型接口
自定义泛型方法
调用泛型方法时,类型会被确定(根据传入的参数类型)
public class Test3 {
public static void main(String[] args) {
Food food = new Food();
food.live(123,"444");
}
}
class Food{
public <A,B> void live(A a,B b){
System.out.println(a.getClass());
System.out.println(b.getClass());
}
}
泛型的继承和通配符
- 泛型没有继承性,不能向上转型
- <?> :支持任意泛型类型
- <? extend A> :支持A类以及A类的子类,规定了泛型的上限
- <? super A> : 支持A类以及A类的父类,不限于直接父类.规定了泛型的下限
public void eat(List<? extends Person> person){
}
public void eat(List<?> person){ // 使用泛型,可以传入任意泛型的类型的List集合
}