相信大家在项目中经常会碰到这种写法,就是说controller返回一个通用的数据结构,通常命名为 CommonRespone 、BaseResult 、ApiRes 等等,并且通常都会用泛型来接纳要返回的业务数据,代码如下
public class CommonResponse<T> {
private Integer code;
private String msg;
private T data;
public static <T> CommonResponse<T> success() {
CommonResponse<T> res = new CommonResponse<>();
res.setCode(0);
res.setMsg("成功");
return res;
}
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;
}
}
乍一看,上面的代码似乎没有问题,严格来说,确实也没问题,但是,这里边对泛型的用法很容易让人产生误解。
类上用 T 来表示泛型类型。success 方法上也用 T 来表示泛型类型。如果对泛型了解不是很深入,还以为这俩是一个类型呢。错了!这俩连毛关系都没有。
看下面这段代码
public class CommonResponse<T> {
private Integer code;
private String msg;
private T data;
public static <U> CommonResponse<U> success() {
CommonResponse<U> res = new CommonResponse<>();
res.setCode(0);
res.setMsg("成功");
return res;
}
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;
}
}