0. 背景
ECJ(Eclipse Compiler for Java)就是Eclipse自帶的java編譯器。
公司的項目都是在Eclipse上面做的雏婶。自己用了一段時間的Idea覺得很爽绘闷,準備換過來寫橡庞,發(fā)現公司基盤報錯了。調查發(fā)現是泛型方面的異常印蔗。整理如下扒最。
1. 問題
公司源碼肯定不能放,把問題整理之后华嘹,關鍵的幾個類的UML類為:
出問題的類之間的UML圖
各個類的代碼為:
基礎類:
public abstract class BaseClass<T> {
}
一個繼承了基礎類的類:
public class TClass extends BaseClass{
}
一個泛型接口:
interface BaseInterface<T extends BaseClass<?>> {
}
運行主類:
public class ECJ_test implements BaseInterface<TClass>{
public static void main(String[] args) {
TClass s = new TClass();
System.out.println(s.hashCode());
}
}
以上代碼在Eclipse中會報warning吧趣,程序能夠編譯通過并運行:
Eclipse報警告
但是正常編譯,執(zhí)行
但是javac是編譯不通過的:
image.png
那么制定了compiler為javac的Idea編譯也就不通過了:
image.png
2. 解決辦法:
2.1 設置編譯器
公司基盤的代碼耙厚,而且有部分類已經打包為jar强挫,部署在maven倉庫中了。要在Idea中編譯就需要把Idea的編譯器換成Eclipse:
Preferences > Build, Execution, Deployment > Java Compiler > User Compiler : Eclipse
Idea設置Compiler
2.2 修改代碼
在遇到這個問題之前颜曾,我直覺上會覺得這個代碼是不符合java語法的纠拔,應該修改為:
public class TClass extends BaseClass<TClass>{
}
這樣修改之后的javac和Idea中都能正常編譯執(zhí)行,且不會有Error或Warning泛豪。
3. 后記
看起來javac比ECJ進行了更嚴格的泛型檢查稠诲。但是問題不止于此,整理問題的過程中想到以下問題待思考诡曙,記下來以后學習:
- 項目部署用的Tomcat臀叙,依賴的也是官方jdk,為什么不會報錯呢价卤?
- 多數文章只會介紹泛型的使用劝萤,而泛型Class<?>和基礎性Class在Java規(guī)范里的區(qū)別究竟是什么呢?