泛型的应用
自定义泛型结构
自定义泛型类与接口
在实际开发中,我们可以根据需求来自定义泛型类和接口。具体格式为:
修饰符 class 类名 <T>
其中便是泛型。需要注意的是,在泛型类中可能会有多个参数,此时应将参数一起放到尖括号中:<T1,T2,T3>。
泛型类的构造器
在定义泛型类后,其构造器不用在声明泛型。如:定义了泛型类order其构造器应该是:
public Order(T orderT, String orderName, int orderId) {
this.orderT = orderT;
this.orderName = orderName;
this.orderId = orderId;
}
public Order() {
}
泛型类的继承关系
父类是一个泛型类时,其子类可以选择保留泛型或者指定泛型。同时子类也可以有自己的泛型。
示例:
public class Order <T>{ //父类
T orderT;
String orderName;
int orderId;
public Order(T orderT, String orderName, int orderId) {
this.orderT = orderT;
this.orderName = orderName;
this.orderId = orderId;
}
public Order() {
}
public int getOrderId() {
return orderId;
}
public T getOrderT() {
return orderT;
}
public void setOrderT(T orderT) {
this.orderT = orderT;
}
@Override
public String toString() {
return "Order{" +
"orderT=" + orderT +
", orderName='" + orderName + '\'' +
", orderId=" + orderId +
'}';
}
}
//子类 指定父类泛型
public class SubOrder extends Order<Integer>{
}
//子类 保留父类泛型
public class SubOrder01<T> extends Order<T>{
}
泛型在继承方面的体现
虽然A类是B类的父类,但是G和G不具有继承关系,是并列关系
A类是B类的父类,A<>和B<>也是继承关系
public static void Test01(){
Object[] o = new Object[10];
String[] s = new String[10];
o=s;//向上造型
List<String> list = null;
List<Object> list1=null;
泛型类的使用注意
- 泛型不同不能相互赋值
- 泛型类实例化之后,操作原来泛型位置的结构必须与指定泛型结构一致
- 泛型若不指定,则会被擦除,泛型结构对应的结构将会设置为Object
- 泛型类是抽象类或接口时,不能创建对象
- 异常类不能时泛型类
- 静态方法中不能使用泛型
泛型方法
泛型方法:在方法中出现了泛型结构,泛型参数与类的泛型参数没有任何关系。即泛型方法所属的类是不是泛型类没有直接关系。泛型方法可以是static 原因是:泛型参数是在调用方法是确定的,并非在实例化类时确定。
public static <E>List<E> copy(E[] arr) {
ArrayList<E> es = new ArrayList<>();
for (E e : arr) {
es.add(e);
}
return es;
}
注意: 泛型方法可以使用static 静态方法不可以使用泛型
通配符的使用
通配符: ?
A类是B类的父类,但是G和G不具有继承关系,是并列关系
G<?>是二者的父类。
public void Test02(){
List<String> list01=null;
List<Object> list02=null;
List<?> list=null;
// list=list01;
// list=list02;
//遍历
// printf(list01);
// printf(list02);
List<String> list03 = new ArrayList<>();
list03.add("AA");
list03.add("BB");
list=list03;
//list<?>不能添加数据,除了null
//但是可以获取数据
list.add(null);
Object o = list.get(0);
System.out.println(o);
}
public static void printf(List<?> list){
Iterator<?> iterator = list.iterator();
while(iterator.hasNext()){
Object o=iterator.next();
System.out.println(o);
}
}
有限制条件的通配符的使用
? extends Person
? super Student
public void test03(){
List<? extends Person> list1=null;
List<? super Student> list2=null;
List<Person> list3=null;
List<Student> list4=null;
List<Object> list5=null;
//读取数据
Person person = list1.get(0);
Object person1 = list1.get(0);
//写入数据
list2.add(new Student());