泛型的定义
允许在定义类、接口时通过一个标识标识类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量、创建对象时)确定(即传入实际的类型参数,也成为类型实参)
泛型的使用
集合中使用
集合接口或集合类在jdk5.0时都修改为带泛型的结构
在实例化集合类时,可以指明具体的泛型类型
指明完以后,在集合类或接口中凡是定义类或接口时,内部结构(比如:方法、构造器、属性等)使用到类的泛型的位置,都指定为实例化的泛型类型
比如: add(E e) —->实例化以后: add(Integer e)
泛型的类型必须是类,不能是基本数据类型。需要用到基本数据类型的位置可以使用包装类
如果实例化时,没有指明泛型的类型,默认类型为Object
自定义泛型结构:泛型类、接口;泛型方法
泛型类
package com.zcx.test.busi.Learn.JavaSenior.generic;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.junit.Test;
/**
* 如何自定义泛型结构:泛型类、泛型接口、泛型方法
* 1. 关于自定义泛型类、泛型接口
* 2.
*
* @author : YukiJudai 2022/4/7 16:22
*/
public class GenericTest {
@Test
public void test1() {
//如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型类型为Object类型
//要求:如果大家定义了类是带泛型的,建议在实例化时要指明类的泛型
Order order = new Order();
order.setOrderT(123);
order.setOrderT("ABC");
//建议实例化时知名类的泛型
Order<String> order1 = new Order<>();
order1.setOrderT("123");
}
@Test
public void test2() {
SubOrder subOrder = new SubOrder();
//由于子类在继承带泛型的父类时,指明了泛型类型,则实例化子类对象时,不再需要指明泛型
}
}
@NoArgsConstructor
@AllArgsConstructor
@Data
class Order<T> {
String orderName;
Integer orderId;
T orderT;
}
//SubOrder不是泛型类
class SubOrder extends Order<Integer> {
}
//SubOrder1仍然是泛型类
class SubOrder1<E> extends Order<E> {
}
泛型方法
定义
在方法中出现了泛型的结构,泛型参数与类的泛型参数没有任何关系。换句话说,泛型方法所属的类是不是泛型类都没有关系
泛型在继承方面的体现
定义
类A是类B的父类,但是G与G不具备子父类关系,二者是并列关系
补充: 类A是类B的父类,A
通配符
使用
通配符: ?
类A是类B的父类,G与G不具备子父类关系,二者共同的父类是: G<?>
添加(写入): 对于list<?>就不能向其内部添加数据
获取(读取): 允许读取数据,读取的数据类型为Object
有限制条件的通配符
? extends A : G<? extends A>可以作为G和G的父类的,其中B是A的子类
? super A : G<? super A>可以作为G和G的父类的,其中B是A的父类