0%

【Java基础】泛型

学习泛型的学习笔记

一、泛型定义

  • 泛型:用”<>”括住的被称为泛型
  • 泛型类似于标签,规定了该类/方法使用哪种类型的数据,自带数据检测

二、在集合中使用泛型

1
2
3
4
ArrayList<Integer> list = new ArrayList<Integer>();

list.add(11);
//规定了Integer型数据,只能使用Integer数据
  • 总结:
    • (1)集合接口在JDK5.0时修改为带泛型的结构
    • (2)在实例化集合类时,可以指明具体的泛型类型
    • (3)指明完以后,在集合类或接口中凡是定义类或接口(比如:方法、构造器、属性等)使用泛型的位置,都指定为实例化的泛型类型。
      • 比如:add(E e) —> 实例化以后:add(Integer e)
    • (4)注意点:泛型实例的类型必须是类,不能是基本数据类型。需要使用时,可以使用其包装类
    • (5)如果实例化没有指定泛型的类型,默认使用Object类型

三、自定义泛型结构

3.1 定义泛型类 / 泛型接口

1
2
3
4
5
6
7
8
9
10
11
12
class Order<T>{//定义泛型
String orderName;
int orderId;
T orderT;//把泛型当作一个类来使用

public Order(){}
public Order(String orderName, int orderId, T orderT) {
this.orderName = orderName;
this.orderId = orderId;
this.orderT = orderT;
}
}
  • 注意:
    • (1)泛型类可以有多个参数,<E1, E2, E3>
    • (2)泛型不同的引用不能相互赋值
    • (3)JDK7.0简化泛型操作:ArrayList<String> list = new ArrayList<>();
    • (4)异常类不能声明为泛型类
    • (5)要用泛型声明数组:T[] arr = (T[]) new Object[10];,不能直接new,因为泛型并不是真正意义上的类
    • (6)类中的带泛型的方法不能声明为static
    • (7)子类继承带泛型的父类时,若指明了泛型类型。在子类实例化时不需要指明泛型

3.2 泛型方法

  • 定义:泛型方法,在方法中出现泛型的结构,泛型参数与类的泛型参数没有关系
1
2
3
4
5
6
7
8
9
一、泛型做方法的参数
public <E> List<E> copyArrayList(E[] arr){
return null;
}

二、泛型作为返回值
public <F> F copy(String str){
return (F)new Object();
}
  • 注意:
    • 泛型方法可以声明为static

四、泛型在继承上的体现

1
2
3
4
5
6
7
8
9
10
11
Object obj = null;
String str = null;
obj = str;//有子父类关系,自动类型转换

List<Object> list1 = null;
List<String> list2 = null;
list1 = list2;//编译不通过,list1与list2不具备子父类关系

List<String> list3 = null;
ArrayList<String> list4 = null;
list3 = list4;
  • 类A是类B的父类,G<A>G<B>二者不具备子父类关系,二者是并列关系
  • 类A是类B的父类,A<G>B<G>仍然是子父类关系

五、通配符

5.1 通配符使用

1
2
3
4
5
6
List<Object> list1 = null;
List<String> list2 = null;
List<?> list = null;//通配符

list = list1;
list = list2;
  • 通配符:’?’
  • 虽然类A是类B的父类,但是G<A>G<B>并没有关系,二者共同的父类时:G<?>

5.2 有限制条件的通配符使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//[Student < Person < Object]
List<? extends Person> list1 = null;//用数学方式来理解,? = [-∞, +∞],? extends Person = [-∞, Person]
List<? super Person> list2 = null;//? super Person = [Person, +∞]

List<Student> list3 = null;
List<Person> list4 = null;
List<Object> list5 = null;

list1 = list3;
list1 =list4;
list1 = list5;//编译不通过,Student不在该区间

list2 = list3;//编译不通过,Object不在该区间
list2 = list4;
list2 = list5;