2011-07-04 42 views
4

我下載的JDK源代碼(6u23 build b5)用於研究,而Eclipsed決定自動構建它。令人驚訝的是,它發現了錯誤。爲什麼發佈的Java源代碼中存在錯誤?

一些例子。

java.beans.MetaData,線1365:

ConstructorProperties annotation = constructor.getAnnotation(ConstructorProperties.class); 

類型不匹配:不能從註釋轉換成ConstructorProperties

java.awt.AWTEvent中,線220:

AWTAccessor.setAWTEventAccessor(new AWTAccessor.AWTEventAccessor() { 

類型new AWTAccessor.AWTEventAccessor(){}必須實現繼承的抽象方法AWTAccessor.AWTEventAccessor.getAccessCont rolContext(AWTEvent)

我認爲這段代碼應該是絕對正確的,如果不是可以學習的Java用法的最佳示例之一。但是,這甚至沒有編譯!

更新:我將java包導出到單個項目中,刪除了java包的默認導入以避免可能的名稱空間衝突並使用JVM 1.6.0來構建它。

+1

什麼Java版本你有編譯它?請注意,軟件中可能總是存在錯誤,即使它具有高質量 - 畢竟它是軟件,不能100%無錯誤。它懷疑甲骨文會提供不可編譯的代碼(但是誰知道,errare humanum est;)) - 所以尋找你的構建環境和他們之間的差異。 – Thomas

+2

幾乎代碼庫中的所有代碼都是一個很好的例子,但是有很多不好的例子。 :( –

+0

@Peter對於每個大型項目,我都認爲這是真的,JDK源代碼和API設計對於他們的年齡是相當不錯的,事實上1.0 API必須在很短的時間內設計(現在希望沒有人會將可複製的實現作爲偉大的架構設計的典範) – Voo

回答

2

您在這裏遇到的問題是仿製藥的規格隨着時間的推移而發展。 :| Sun/Oracle Java的最新版本正確地編譯了這些代碼,但是它現在編譯的IDE沒有實現。 (不幸的是,Eclipse使用它自己的編譯器,它並不總是與Sun/Oracle編譯器完全一樣)

我非常確定編譯器的老版本會產生這行代碼的錯誤。

它曾經是如果一個類型不是泛型的,所有的泛型都被關閉了,即使這樣做沒有意義。在這種方法的情況下。

public <T extends Annotation> T getAnnotation(Class<T> annotationClass) 

// constructor is not a generic type. 
private static String[] getAnnotationValue(Constructor constructor) { 
     ConstructorProperties annotation = constructor.getAnnotation(ConstructorProperties.class); 

較舊的編譯器會認爲這是非泛型方法,因爲構造函數不是泛型的。然而,較新的編譯器識別這種方法是自包含的,並且該類是否是非泛型類型應該沒有關係。

+0

在這種情況下,我可以爲Eclipse做些事情嗎? –

+0

我不會嘗試重新編譯整個JDK(它只在src.zip中完成大約95%),只需重新編譯感興趣的類(不要說所有;)。您可以使用Sun/Oracle編譯器來編譯源代碼,更改代碼以便在Eclipse中編譯,或者獲取IBM JDK源代碼。 –

+0

我使用Java包的項目,而不是整個JDK。但是,感謝關於改變編譯器的建議!我會google的。 –

0

哦,就通用方法參數而言,對於JLS的實現存在很多混淆。很可能你發佈的代碼是用javac編譯的,但不能用於Eclipse(在我看來,它有一個優越但不正確的編譯器)。這將編譯在Eclipse:

private static String[] getAnnotationValue(Constructor<?> constructor) { 
    ConstructorProperties annotation = 
    constructor.getAnnotation(ConstructorProperties.class); 

這不(你的榜樣,與原始類型的構造函數):

private static String[] getAnnotationValue(Constructor constructor) { 
    ConstructorProperties annotation = 
    constructor.getAnnotation(ConstructorProperties.class); 

退房這個問題,我最近有。這讓我毛骨悚然:

Reference is ambiguous with generics

我肯定會去查找錯誤在Eclipse

+0

那麼沒有實現抽象方法呢?這個錯誤與泛型無關。 –

+0

我無法重現的錯誤。我的JDK中沒有'AWTAccessor.AWTEventAccessor.getAccessControlContext(AWTEvent)'方法 –

相關問題