今天复习到了泛型 平时都是创建集合直接输入泛型类型。
什么是泛型?
编译器可以对泛型参数进行检测,并且通过泛型参数可以指定传入的对象类型。比如 ArrayList<Person> persons = new ArrayList<Person>() 这行代码就指明了该 ArrayList 对象只能传入 Person 对象,如果传入其他类型的对象就会报错。
思想: 类型参数化
jdk1.5以后推出了泛型,他的动机:
1、原生 List 返回类型是 Object ,需要手动转换类型才能使用,使用泛型后编译器自动转换。
那么一大好处就是:不需要强制类型转换,避免了classCastException。
2、 最重要:为了创建容器类 此话怎讲!
自定义接口通用返回结果 CommonResult<T> 通过参数 T 可根据具体的返回类型动态指定结果的数据类型
这是常见的两个服务器统一响应数据格式类(第一个来自于springsecurity 、第二个是mms
也是一个泛型类 (泛型可以用在接口、类、方法)
成员属性的类型上是一个泛型类型。
注意4、5行的注释
/**
* @Author 三更 B站: https://space.bilibili.com/663528522
*/
//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
//在实例化泛型类时,必须指定T的具体类型
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResponseResult<T> {
/**
* 状态码
*/
private Integer code;
/**
* 提示信息,如果有错误时,前端可以获取该字段进行提示
*/
private String msg;
/**
* 查询到的结果数据,
*/
private T data;
public ResponseResult(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public ResponseResult(Integer code, T data) {
this.code = code;
this.data = data;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public ResponseResult(Integer code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}
}
/**
* @author caiyongyong 来自mms?
*/
// 确保序列化JSON时,如果是null对象,其key也会消失。
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class ServerResponse<T> implements Serializable {
private int status;
private String msg;
private T data;
private ServerResponse(int status) {
this.status = status;
}
private ServerResponse(int status, T data) {
this.status = status;
this.data = data;
}
private ServerResponse(int status, String msg, T data) {
this.status = status;
this.msg = msg;
this.data = data;
}
private ServerResponse(int status, String msg) {
this.status = status;
this.msg = msg;
}
@JsonIgnore
//使之不在json序列化结果当中
public boolean isSuccess() {
return this.status == ResponseCode.SUCCESS.getCode();
}
public int getStatus() {
return status;
}
public T getData() {
return data;
}
public String getMsg() {
return msg;
}
// 快速构建返回结果
// 成功时的调用
public static <T> ServerResponse<T> createBySuccess() {
return new ServerResponse<T>(ResponseCode.SUCCESS.getCode());
}
public static <T> ServerResponse<T> createBySuccessMessage(String msg) {
return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(), msg);
}
public static <T> ServerResponse<T> createBySuccess(T data) {
return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(), data);
}
public static <T> ServerResponse<T> createBySuccess(String msg, T data) {
return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(), msg, data);
}
public static <T> ServerResponse<T> createByError() {
return new ServerResponse<T>(ResponseCode.ERROR.getCode(), ResponseCode.ERROR.getDesc());
}
public static <T> ServerResponse<T> createByErrorMessage(String errorMessage) {
return new ServerResponse<T>(ResponseCode.ERROR.getCode(), errorMessage);
}
public static <T> ServerResponse<T> createByErrorCodeMessage(int errorCode, String errorMessage) {
return new ServerResponse<T>(errorCode, errorMessage);
}
public static <T> ServerResponse<T> createByErrorCodeMessage(ResponseCode responseCode) {
return new ServerResponse<T>(responseCode.getCode(), responseCode.getDesc());
}
}
在实例化他们的时候,例如:
public ResponseResult login(User user) {
..........................
//token响应给前端
Map<String,String> map = new HashMap<>();
map.put("token",jwt);
return new ResponseResult(200,"登录成功",map);
}
知识点:
1、基本数据类型不可以作泛型,对应的包装类型可以
2、泛型是一种语法糖, 原理是类型擦除。
在做 逆波兰表达式求值的力扣时
一个栈用了泛型 一个没用 感觉还是用了好 否则强转
但是包装类型之间一律使用equals来判断值是否相等 ==是不会触发自动拆箱的 只有加减乘除才能