泛型
引言:
- 泛型:泛型允许程序员在编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型
- 人话:泛型对规定范围产生约束,约束后只能存储泛型指定的类型
- 诞生:JDK5.0以后
- 作用:泛型旨在程序的编译阶段起作用,只是给编译器参考使用的(运行阶段泛型没用)
- 使用:List<类名A标识符>,表示List集合中只允许存储类名A类型的数据,用泛型来指定集合中存储的数据类型,<类名标识符>里面一般是类名,也可以自定义类名标识符
- 优点:集合存储的元素类型统一,集合中取出的元素类型是泛型指定类型,不需要进行大量的“向下转型”,不需要大量的"强制类型转换"
- 缺点:集合中存储的元素缺乏多样性
代码演示:
未使用泛型前:
package com.lbj.javase.collection;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class GenericTest01 {public static void main(String[] args) {List list=new ArrayList<>();//准备对象Animal animal=new Cat();Animal animal1=new Bird();//将对象添加到集合中list.add(animal);list.add(animal1);//遍历集合,取出每个Animal,让它move()Iterator iterator=list.iterator();while (iterator.hasNext()){//o中没有move方法,无法调用,需要向下转型Object o=iterator.next();//通过判断是否o属于某个类,达到转型效果if (o instanceof Animal){Animal a= (Animal) o;a.move();System.out.println(a);}}}}
class Animal{public void move(){System.out.println("动物在移动");}
}
class Cat extends Animal{//子类特有方法public void catchMouse(){System.out.println("猫抓老鼠");}
}
class Bird extends Animal{//子类特有方法public void fly(){System.out.println("鸟在飞");}
}
使用泛型后:
package com.lbj.javase.collection;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class GenericTest01 {public static void main(String[] args) {List list=new ArrayList<>();//准备对象Animal cat=new Cat();Animal bird=new Bird();//将对象添加到集合中list.add(cat);list.add(bird);//遍历集合,取出每个Animal,让它move()
// Iterator iterator=list.iterator();
// while (iterator.hasNext()){
// //o中没有move方法,无法调用,需要向下转型
// Object o=iterator.next();
//
// //通过判断是否o属于某个类,达到转型效果
// if (o instanceof Animal){
// Animal a= (Animal) o;
// a.move();
// System.out.println(a);
// }//}//获取迭代器Iterator<Animal> iterator=list.iterator();//遍历集合,表示迭代器迭代的是Animal类型while (iterator.hasNext()){//使用泛型后,每一次迭代返回的数据都是Animal类型Animal animal=iterator.next();animal.move();System.out.println(animal);//调用子类特有的方法还是需要继续向下转型的if (animal instanceof Cat){Cat c= (Cat) animal;c.catchMouse();}if (animal instanceof Bird){Bird b= (Bird) animal;b.fly();}}}}
class Animal{public void move(){System.out.println("动物在移动");}
}
class Cat extends Animal{//子类特有方法public void catchMouse(){System.out.println("猫抓老鼠");}
}
class Bird extends Animal{//子类特有方法public void fly(){System.out.println("鸟在飞");}
}
自定义泛型:
引言 :
自定义泛型类就是把泛型定义在类上,用户使用该类的时候,才把类型明确下来
自定义泛型的时候,<>是尖括号中的一个标识符,内容随便写
java源代码中经常出现的<E>和<T>
<E> 表示 Element
<T>表示 Type
用户想要使用哪种类型,就在创建的时候指定类型。使用的时候,该类就会自动转换成用户想要使用的类型了。
代码演示:
package com.lbj.javase.collection;/*** @author LBJ* @version V1.0* @Package com.lbj.javase.collection* @date 2021/4/10 15:49* @Copyright 公司*/
public class GenericTest03{
//类比得出结论
public static void main(String[] args) {//创建对象并指定元素类型ObjectTool<String> tool = new ObjectTool<>();tool.setObj(new String("asdfghjkl"));String s = tool.getObj();System.out.println(s);//创建对象并指定元素类型ObjectTool<Integer> objectTool = new ObjectTool<>();/*** 如果我在这个对象里传入的是String类型的,它在编译时期就通过不了了.*///objectTool.setObj("asda");objectTool.setObj(10);int i = objectTool.getObj();System.out.println(i);
}
}class ObjectTool<T>{public T obj;public T getObj() {return obj;}public void setObj(T obj) {this.obj = obj;}
}