問題與處理策略
問題描述
@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);
}