1,泛型的概述
泛型:是JDK中引入的特性,可以在编阶段译段约束操作的数据类型,并进行检查。
泛型的格式:<数据类型>
注意:泛型中只能使用引用数据类型
package Tom.zhu.lianxi;
import java.util.ArrayList;
public class fanixng {
public static void main(String[] args) {
ArrayList<String>arr=new ArrayList<>();
arr.add("小红");
System.out.println(arr);
}
}
没有泛型的时候,集合如何存储数据??
package Tom.zhu.lianxi;
import java.util.ArrayList;
import java.util.Iterator;
public class fanixng {
public static void main(String[] args) {
ArrayList<String>arr=new ArrayList<>();
System.out.println(arr);
Iterator<String> it= arr.iterator();
while (it.hasNext()){
String str= it.next();
}
}
}
创建一个学生类 javabean
package com.itheima.a04mygenerics;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
2:泛型的好处
-
统一数据类型
-
把运行期间的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来。
-
扩展知识点:Java中的泛型其实是伪泛型。
3:泛型的细节
1.泛型总不能写基本数据类型
2.指定泛型的具体的类型后,传入数据时可以传入该类类型或其子类类型
3.如果不写泛型,默认是Object
ArrayList<Animal> list=new ArrayList<>();
list.add(new Animal());
list.add(new Cat());
list.add(new Dog());
4:泛型可以在很多地方进行定义
ArrayList<String> list=new Arraylist<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
-
类后面:泛型类
-
方法上面:泛型方法
-
接口后面:泛型接口
5:泛型类
使用场景:在一个类中,某个变量的数据类型不确定时,就可以定义带有泛型的类。
此处E可以理解为变量,但是不是用来记录数据的,而是记录数据的类型,可以写成T,E,K,V等。
package com.itheima.a04mygenerics;
import java.util.Arrays;
public class MyArrayList<E> {
Object[] obj = new Object[10];
int size;
/*
E : 表示是不确定的类型。该类型在类名后面已经定义过了。
e:形参的名字,变量名
* */
public boolean add(E e){
obj[size] = e;
size++;
return true;
}
public E get(int index){
return (E)obj[index];
}
@Override
public String toString() {
return Arrays.toString(obj);
}
}
6:泛型方法
方法中形参类型不确定时,可以使用类名后面定义的泛型<E>
方法中形参类型不确定时
-
方案1:使用类名后面的泛型,所有方法都能用
-
方案2:在方法声明上定义自己的泛型 只有本方法能用
此处T可以理解为变量,但是不是用来记录数据的,而是记录类型的,可以写成:T,E,K,V等
8:泛型接口
9:泛型的继承和通配符
泛型不具备继承性,但是数据具备继承性
10:总结
1:什么是泛型?
-
JDK5引入的特性,可以在编译阶段约束操作的数据类型,并进行检查
2:泛型的好处?
-
统一数据类型
-
把运行时期的问题以前到了编译期间,避免了强制
类型转换可能出现的异常,因为在编译阶段类型就能确定下来。
3:泛型的细节?
-
泛型中不能写基本数据类型
-
指定泛型的具体类型后,传递数据时,可以传入该类型和它的子类类型
-
如果不写泛型,类型默认是Object
4:哪里定义泛型?
-
泛型类:在类名后面定义泛型,创建该类对象的时候,确定类型
-
泛型方法:在修饰符后面定义方法,调用该方法的时候,确定类型
-
泛型接口:在接口名后面定义泛型,实现类确定类型,实现类延续泛型
5:泛型的继承和通配符
-
泛型不具备继承性,但是数据具备继承性
-
泛型的通配符:?
? extend E
?super E
6:使用场景
-
定义类,方法,接口的时候,如果类型不确定,就可以定义泛型
-
如果类型不确定,但是能知道是哪个继承体系中的,可以使用泛型的通配符