泛型的本质是类型参数化
java 中泛型标记符:
- E - Element (在集合中使用,因为集合中存放的是元素)
- T - Type(Java 类)
- K - Key(键)
- V - Value(值)
- N - Number(数值类型)
- ? - 表示不确定的 java 类型
泛型类
泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分。
和泛型方法一样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。因为他们接受一个或多个参数,这些类被称为参数化的类或参数化的类型。
- 泛型类,如果没有指定具体的数据类型,此时,操作类型是Object
- 泛型的类型参数只能是类类型,不能是基本数据类型
- 泛型类型在逻辑上可以看成是多个不同的类型,但实际上都是相同类型
从泛型类派生子类
- 子类也是泛型类,父类和子类的泛型类型要一致
- 子类不是泛型类,父类要明确泛型的数据类型
class Child<T> extends Father<T>
class Child extends Father<String>
使用泛型类实现API统一返回结果格式
package com.zm.controller;
import java.io.Serializable;
public class ApiResult<T> implements Serializable {
private T data;
private int code;
private String msg;
public ApiResult() {
}
public ApiResult(T data) {
this.data = data;
}
public T getData() {
return data;
}
public Integer getCode() {
return code;
}
public String getMsg() {
return msg;
}
public ApiResult<T> setData(T data) {
this.data = data;
return this;
}
public ApiResult<T> setCode(Integer code) {
this.code = code;
return this;
}
public ApiResult<T> setMsg(String msg) {
this.msg = msg;
return this;
}
/**
* 请求成功回调
*
* @return
*/
public static ApiResult<?> successMsg() {
return new ApiResult<>().setCode(200).setMsg("ok");
}
/**
* 请求成功回调
*
* @param t 对象参数
*/
public static <T> ApiResult<T> successMsg(T t) {
return new ApiResult<>(t).setCode(200).setMsg("ok");
}
/**
* 请求失败回调
*
* @param code 状态码
* @param msg 描述信息
*/
public static ApiResult<?> errorMsg(int code, String msg) {
return new ApiResult<>().setCode(code).setMsg(msg);
}
/**
* 请求失败回调
*
* @param msg 描述信息
*/
public static ApiResult<?> errorMsg(String msg) {
return new ApiResult<>().setCode(500).setMsg(msg);
}
}
泛型接口
- 实现类不是泛型类,接口要明确数据类型
- 实现类也是泛型类,实现类和接口的泛型类型要一致
interface 接口名称 <泛型标识,泛型标识,…> {
泛型标识 方法名();
.....
}
泛型方法
修饰符 <T,E, ...> 返回值类型 方法名(形参列表) { 方法体... }
泛型通配符
泛型通配符上限
类/接口<? extends 实参类型>
要求该泛型的类型,只能是实参类型,或实参类型的子类型
泛型通配符下限
类/接口<? super 实参类型>
要求该泛型的类型,只能是 实参类型 或 实参类型的父类类型