![](/img/trans.png)
[英]Java generics code compiles with javac, fails with Eclipse Helios
[英]Java generics code compiles in eclipse but not in command line
我知道過去有幾個問題是關於在eclipse中編譯而不是在命令行中編譯的東西,但我還沒找到問題的答案。
特別是,我認為我能夠設置eclipse使用我的系統編譯器,但仍然沒有解決問題。
我目前正在檢查:'首選項 - > Java - >已安裝的JRE'。
這只包含一個JRE,這是我的系統之一。
以下是問題的具體細節
我有一個java泛型類,它將Enum類型作為參數,如下所示:
public class MyClass<T extends Enum<T>>
在類的某個地方,我將已知的枚舉值與T的值進行比較。例如,讓我們假設我有這個枚舉:
public enum OtherEnum{
a,
b
}
然后我測試:
protected void foo(T enumVal){
if(enumVal == OtherEnum.a){
// do something
}
else if(enumVal == OtherEnum.b){
// do something else
}
}
這在eclipse中編譯沒有問題,但在命令行javac中我收到此錯誤:
無與倫比的類型:T和OtherEnum
我在兩個使用java 1.6變體(1.6.0_26和1.6.0_16)的系統上嘗試了這個。 一個是Mac,另一個是linux。 他們都給出了同樣的錯誤,而eclipse正在編譯而沒有任何問題。
所以:
如何確定使用哪個編譯器eclipse?
甚至這里的問題是什么?
謝謝!
這是一個已在JDK 7中修復的javac錯誤。
請參見http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6548436
非常有趣的問題。
以下代碼無法編譯
Integer x = null;
String s = null;
if(x==s){} // error: incomparable types
JLS3#15.21.3 [1]說
如果無法通過轉換轉換將任一操作數的類型轉換為另一個操作數的類型,則會發生編譯時錯誤(第5.5節)
顯然,前面的示例看起來像一個明顯的編程錯誤,因此規范嘗試捕獲它並提醒程序員。 Java想要允許它不會有任何麻煩。 該示例的解決方法是將一側轉換為Object
。
回到你的問題,我們需要決定是否可以將OtherEnum
為T
,或者相反。 這是一個令人驚訝的難題; 按照JLS3#5.5 [2]的程序,答案是否定的。
歸結為是否可以將OtherEnum
為Enum<T>
; 然后我們可以找到超類型X=Enum<OtherEnum>
和Y=Enum<T>
,它們是可證明不同的參數化類型。 所以演員是非法的。
那么,這樣的規范太精細了,誰在正確的思想中會關心?
您可以通過將一個轉換為Object
來解決它,比如說(Object)enumVal == OtherEnum.a
Java 7的行為不同,它會編譯您的代碼。 我不知道原因。 Java7可能引入了一個新bug。 或者它有一個允許代碼的新規范(但我們無法訪問新規范)。 另一種可能性是我誤解了“可證明不同的參數化類型”這個術語; 然而,如果沒有正式的定義, Enum<OtherEnum>
和Enum<T>
是截然不同的直觀。
REF
[1] http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.21.3
[2] http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#20232
Eclipse使用它自己的java編譯器實現(ECJ),它與javac無關。
Eclipse Compiler for Java:
增量Java編譯器。 作為Eclipse構建器實現,它基於從VisualAge for Java編譯器演化而來的技術。 特別是,它允許運行和調試仍包含未解決錯誤的代碼。
單獨的編譯器...使用==強制進行更嚴格的編譯時間檢查,因此在CL中它強制執行類型比較和錯誤。 在Eclipse中,您可以管理編譯時的設置,並放松限制。
您可以嘗試Enum.equals(),它可能不會強制執行這種嚴格的編譯時類型比較。 只是一個想法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.