目录
泛型
是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。
泛型的格式:<引用数据类型>
举例:
ArrayList<String> list=new ArrayList<>();
list.add("aaa");
list.add("李华");
list.add("***");
包装类:
如果要使用基本数据类型,需要使用其对应的包装类。常用的包装类如下:
byte | Byte |
short | Short |
char | Character |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
泛型的好处:
1.统一数据类型
2.把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来。
泛型的细节:
1.泛型中不能写基本数据类型。
2.指定泛型的具体数据后,传递数据时,可以传入该类型和它的子类型。
3.如果不写泛型,类型默认是Object。
泛型类
使用场景:当一个类中,某个变量的数据类型不确定时,就可以定义带有泛型的类。
格式:
修饰符 class 类名< 类型>{
}
举例:
public class Arraylist<E> {
}
注解:此处E可以理解为变量,但不是用来记录数据的,而是记录数据类型,可以写成:T,E,K,V等。
泛型方法
使用场景:方法中参数类型不确定时
解决方案1:使用类名后面定义的泛型 所有方法都能用
解决方案2:在方法申明上定义自己的泛型 只能本方法使用
格式:
修饰符<类型>返回值类型 方法名(类型 变量名){
}
举例:
public static<T> void show(T t){
}
public static<E> void addAll(ArrayList<E> list, E...e){
for (int i = 0; i < e.length; i++) {
E element=e[i];
list.add(element);
}
}
注解: E...e为可变参数,底层是一个数组。
泛型接口
格式:
修饰符 interface 接口名<类型>{
}
举例:
public interface List <E>{
}
使用方式:
方式1:实现类给出具体类型
方式2:实现类延续泛型,创建对象时再确定
泛型的继承和通配符
泛型不具备继承性,但数据具备继承性
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<Ye> list1 = new ArrayList<>();
ArrayList<Fu> list2 = new ArrayList<>();
ArrayList<Zi> list3 = new ArrayList<>();
//泛型不具备继承性
method(list1);
//method(list2);报错
//method(list3);报错
//数据具备继承性
list1.add(new Ye());
list1.add(new Zi());
list1.add(new Fu());
}
public static void method(ArrayList<Ye> list){
}
}
泛型的通配符:
?也表示不确定的类型,但它可以进行类型限定。
使用格式:
?extends E:表示可以传递E或者E所有的子类类型
?super E:表示可以传递E或者E所有的父类类型
举例:
public static void method(ArrayList<? extends Ye> list){
}
总结
应用场景:
1.如果我们在定义类,方法,接口时候,如果类型不确定,就可以定义泛型类,泛型方法,泛型接口。
2.如果类型不确定,但是能知道以后只能传递某个体系中的,就可以使用泛型通配符。