1.泛型的概述
个人对泛型的理解:就像公厕中的男女厕所,男的进男厕所,女的进女厕所。反省也是如此,泛型就是类型参数化,就好比我建了一栋房子,在门口竖了个牌子说:我会让我的亲戚朋友进来,不允许陌生人进来。
2.泛型在集合中的应用
2.1不使用泛型
// 1.不使用泛型
List list = new ArrayList();
list.add("1");
list.add('2');
list.add(3);
list.add(new String());
你会发现,在集合中不使用泛型的时候,什么类型都能往list容器放,这虽然不会报错,但如果你遍历list就有可能会报错
2.2使用泛型
// 1.使用泛型
List<String> list = new ArrayList<>();
list.add("1");
list.add('2'); // 编译不通过
list.add(3); // 编译不通过
list.add(new String()); // 编译通过
你会发现,在使用泛型之后,如果不是String类型的就不允许你放入到list容器中,在编译阶段就会报错,减少了你在运行时阶段出错的概率
3.泛型类,自定义泛型类,泛型接口,泛型方法的使用
3.1泛型类的使用
package com.atguigu.java;
import java.util.ArrayList;
import java.util.List;
public class Order<T> {
String orderName;
int orderId;
T orderNumber;
public Order(){}
public Order(String orderName, int orderId,T orderNumber){
this.orderId = orderId;
this.orderName = orderName;
this.orderNumber = orderNumber;
}
public void setOrderNumber(T orderNumber) {
this.orderNumber = orderNumber;
}
public T getOrderNumber() {
return orderNumber;
}
public <E> List<E> copyArrayFromList(E[] array){
ArrayList<E> arrayList = new ArrayList<>();
for(E e:array){
arrayList.add(e);
}
return arrayList;
}
}
3.2泛型接口的使用类似于泛型类,在此不再赘述
3.3泛型方法
public <E> List<E> copyArrayFromList(E[] array){
ArrayList<E> arrayList = new ArrayList<>();
for(E e:array){
arrayList.add(e);
}
return arrayList;
}
泛型方法所在的类既可以是一个泛型类,也可以是一个非泛型类,在泛型方法中返回值类型前面一定要加个<E>,字母无所谓。要不然,不同于此类型结构的方法都不是泛型方法。
3.4自定义泛型类
package com.atguigu.java;
import java.util.ArrayList;
import java.util.List;
public class Order<T> {
String orderName;
int orderId;
T orderNumber;
public Order(){}
public Order(String orderName, int orderId,T orderNumber){
this.orderId = orderId;
this.orderName = orderName;
this.orderNumber = orderNumber;
}
public void setOrderNumber(T orderNumber) {
this.orderNumber = orderNumber;
}
public T getOrderNumber() {
return orderNumber;
}
public <E> List<E> copyArrayFromList(E[] array){
ArrayList<E> arrayList = new ArrayList<>();
for(E e:array){
arrayList.add(e);
}
return arrayList;
}
}
在自定义泛型类时需要注意,在类或接口上声明的泛型,在本类/本接口即代表某种类型,可以作为非静态属性的类型,可以作为非静态方法的返回值类型,,可以作为非静态方法的参数类型。但是静态方法中不能使用泛型。父类有泛型,子类可以选择保留父类泛型,或指定新的泛型
4.泛型通配符?
4.1 下界
诸如List<? super Person>,此谓下届,也就是说往list里面放的东西至少是一个Person类型,不能是Person的子类。
4.2 上界
诸如List<? extends Person>,此谓上界,也就是说往list里面方的东西至多是一个Person类型,不能是Person1的父类。
@Test
public void test1(){
List<? extends Person> list = null;
List<? super Person> list1 = null;
List<Student> list2 = new ArrayList<>();
List<Person> list3 = new ArrayList<>();
List<Object> list4 = new ArrayList<>();
list = list2;
list = list3;
// list = list4;
// list1 = list2;
list1 = list3;
list1 = list4;
// list.add(new Student());
// list.add(new Person());
// list.add(new Object());
list1.add(new Student());
list1.add(new Person());
// list1.add(new Object());
}
写了//都是编译不通过的