泛型:当我们不知道用什么数据类型的时候,可以使用泛型.将泛型看成是一个变量,用来接收数据类型.
常用的泛型标识:T、E、K、V
一、泛型类(1)如果定义的类使用了泛型,在创建对象的时候指定类型(不支持基本数据类型);
(2)当调用的时候没指定类型,则数据类型默认为Object类型.;
(3)泛型类在逻辑上可以看成是多个不同的类型,但是实际都是相同类型;
public class Generic二、泛型类的派生子类{ private T key; public T getKey() { return key; } public void setKey(T key) { this.key = key; } }
(1)子类是泛型类,子类和父类泛型要保持一致
public class GenericSunextends Generic
(2)子类不是泛型类,泛型父类要指定类型
public class GenericSun extends Generic三、泛型接口
public interface 接口名称{}
(1)实现类不是泛型类,接口要明确数据类型
public class 类名称 implements 接口名称{}
(2)实现类是泛型类,接口泛型要和实现类泛型保持一致
// 在创建多态或对象的时候指定泛型的类型 public class 类名称implements 接口名称 {}
四、泛型方法
public返回值类型 方法名(参数列表){ // 普通方法} public static 返回值类型 方法名(参数列表){ // 静态方法} public E getAdd(E... e) { // 泛型方法与可变参数} public E getAdd(E e) {return e;} public ArrayList getArrayList(ArrayList arrayList, K k) { return arrayList; }
注意事项:
(1)public后面跟的<>表示声明此方法为泛型方法;
(2)参数列表中使用了几个泛型,<>内就指定几个泛型;
(3)在调用方法的时候指明泛型的具体类型;
(4)泛型类中的泛型方法,两者之间没有任何关系,即使泛型标识符相同;
五、类型通配符
使用场景:当使用泛型类或接口做参数传递的数据时,又或者创建带有泛型的对象,泛型类型不确定,可以通过>表示。一但使用泛型统配符后,只能使用Object类中共性的方法,集合中元素自身无法使用.
例子:
public class Class1 {
public static void main(String[] args) {
ArrayList str = new ArrayList<>();
str.add("qw");
str.add("qw1");
str.add("qw2");
str.add("qw3");
ArrayList in = new ArrayList<>();
in.add(19);
in.add(12);
in.add(1921);
in.add(191);
in.add(1912);
abb(str);
abb(in);
}
public static void abb(ArrayList> arr){
Iterator> in1 = arr.iterator();//这是一个多态
while(in1.hasNext()){ //判断集合中是否有下一个元素
Object obj = in1.next(); //in1.next属于包装类,Object又是祖宗类,这是一个多态
System.out.println(obj); //打印这个元素
}
}
}
六、类型通配符的上下限
建立场景
public class Animal {
}
public class Cat extends Animal{
}
public class MinCat extends Cat{
}
public class MaxCat extends Cat{
}
类型通配符的上限格式
类型名称 extends 类 > 对象名称 //只能接收该类型及其子类
public class demo {
public static void main(String[] args) {
ArrayList animalArrayList = new ArrayList<>();
ArrayList catArrayList = new ArrayList<>();
ArrayList minCats = new ArrayList<>();
showAnimal(catArrayList);
showAnimal(minCats);
}
public static void showAnimal(ArrayList extends Cat> cats) {
// 上限泛型不能向集合填充数据,如果传递过来的是MinCat,那么与MinCat平行的Cat的子类可以有无数个,这些子类都继承与Cat
// cats.add(new Cat());
// cats.add(new MinCat());
// 数据遍历,使用多态
for (Cat cat : cats) {
System.out.println(cat);
}
}
}
类型通配符的下限格式
类型名称 super 类 > 对象名称 //只能接收该类型及其父类型
public class demo {
public static void main(String[] args) {
List list = new ArrayList<>();
ArrayList animalArrayList = new ArrayList<>();
ArrayList catArrayList = new ArrayList<>();
ArrayList minCats = new ArrayList<>();
showAnimal(catArrayList);
showAnimal(animalArrayList);
}
public static void showAnimal(ArrayList super Cat> cats) {
// 可以填充Cat的子类
cats.add(new Cat());
cats.add(new MinCat());
// 便利数据需要使用Object类型接收,因为类型最低为Cat
for (Object cat : cats) {
System.out.println(cat);
}
}
}
七、类型擦除
概念:泛型是Java 1.5版本才引进的概念,在这之前是没有泛型的,但是泛型代码能够很好地和之前版本的代码兼容。那是因为,泛型信息只存在于代码编译阶段,在进入JVM之前,与泛型相关的信息会被擦除掉,我们称之为–类型擦除。
(1)无限制类型擦除
(2)有限制类型擦除
(3)擦除方法中类型定义的参数
(4)桥接方法
八、泛型与数组 七、泛型和反射


