2011-07-04 6 views
4

研究のためにJDKのソースコード(6u23ビルドb5)をダウンロードしました.Eclipsedは自動的にビルドすることにしました。驚いたことに、それは間違いを見つけました。リリースされたJavaソースコードにエラーがあるのはなぜですか?

いくつかの例です。

java.beans.MetaData、行1365:

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

型の不一致:ConstructorProperties

java.awt.AWTEventに注釈から変換することはできません、ライン220:

AWTAccessor.setAWTEventAccessor(new AWTAccessor.AWTEventAccessor() { 

新しいAWTAccessor.AWTEventAccessor(){}型は継承した抽象メソッドを実装する必要がありますAWTAccessor.AWTEventAccessor.getAccessCont rolContext(AWTEvent)

このコードは、Javaの使い方の最良の例の1つではない場合、このコードは絶対に正しいと思われました。しかし、それはコンパイルされません!

更新:個々のプロジェクトにjavaパッケージをエクスポートし、可能な名前空間の競合を避けるためにJavaパッケージのデフォルトのインポートを削除し、JVM 1.6.0を使用してビルドしました。

+1

でエラーを探したいですか?結局のところ、たとえソフトウェアが高品質であっても、ソフトウェアには常にエラーが存在する可能性があることに注意してください。ソフトウェアは結局100%エラーフリーではありません。オラクル社は、コンパイル不可能なコードを提供することに疑いがあります(しかし、ヒューマナム・ヒューマミストを知っている人は誰でも)) - ビルド環境とビルド環境の違いを探します。 – 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全体を再コンパイルしようとしません(その約95%はsrc.zipでしか完成しません)。興味のあるクラスを再コンパイルするだけです。 Sun/Oracleコンパイラを使用してソースをコンパイルしたり、Eclipseでコンパイルするようにコードを変更したり、IBM JDKのソースを入手することができます。 –

+0

私はJDK全体ではなく、javaパッケージでプロジェクトを使用します。しかし、コンパイラの変更についてのアドバイスをありがとう!私はそれを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

私は間違いなく、Javaのバージョンは、あなたがそれをコンパイルしたのは何のEclipse

+0

のsrc.zipを見たいと思うかもしれません。このエラーはジェネリックスとは関係ありません。 –

+0

そのエラーは再現できませんでした。 JDKにAWTAccessor.AWTEventAccessor.getAccessControlContext(AWTEvent)メソッドがありません –

関連する問題