Java 泛型参数问题:‘ResponseData.this‘ cannot be referenced from a static contex
问题与处理策略
问题描述
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResponseData<T> {private Integer code;private String msg;private T data;public static final int CODE_SUCCESS = 2001;public static final int CODE_FAIL = 3001;public static ResponseData<T> success(String msg, T data) {return new ResponseData<>(CODE_SUCCESS, msg, data);}
}
- 上述代码,会报如下错误
'ResponseData.this' cannot be referenced from a static contex
# 翻译ResponseData.this 不能从静态上下文中引用
问题原因
-
在 Java 中,在类上定义了泛型参数(例如,
ResponseData<T>
),这个类型参数T
是实例级别的 -
静态方法不能直接使用类级别的泛型参数
-
在上例中,方法
public static ResponseData<T> success(String msg, T data)
中的<T>
是方法级别的类型参数,与类级别的T
是独立的,虽然名字相同,但作用域不同 -
静态方法需要独立声明自己的泛型参数
<T>
处理策略
- 为静态方法独立声明自己的泛型参数
<T>
public static <T> ResponseData<T> success(String msg, T data) {return new ResponseData<>(CODE_SUCCESS, msg, data);
}
- 或者,为了更加清晰,可以为静态方法独立声明自己的泛型参数为
<R>
(或其他)
public static <R> ResponseData<R> success(String msg, R data) {return new ResponseData<>(CODE_SUCCESS, msg, data);
}