泛型
引言:
- 泛型:泛型允许程序员在编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型
- 人话:泛型对规定范围产生约束,约束后只能存储泛型指定的类型
- 诞生: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;
}
}