为什么发布的Java源代码中会出现错误?

为什么发布的Java源代码中会出现错误?,java,Java,我下载了JDK源代码(6u23构建b5)进行研究,Eclipsed决定自动构建它。令人惊讶的是,它发现了错误 举几个例子 java.beans.MetaData,第1365行: ConstructorProperties annotation = constructor.getAnnotation(ConstructorProperties.class); 类型不匹配:无法从批注转换为构造函数属性 java.awt.AWTEvent,第220行: AWTAccessor.setAWTEvent

我下载了JDK源代码(6u23构建b5)进行研究,Eclipsed决定自动构建它。令人惊讶的是,它发现了错误

举几个例子

java.beans.MetaData,第1365行:

ConstructorProperties annotation = constructor.getAnnotation(ConstructorProperties.class);
类型不匹配:无法从批注转换为构造函数属性

java.awt.AWTEvent,第220行:

AWTAccessor.setAWTEventAccessor(new AWTAccessor.AWTEventAccessor() {
类型new AWTAccessor.AWTEventAccessor(){}必须实现继承的抽象方法AWTAccessor.AWTEventAccessor.getAccessControlContext(AWTEvent)

我认为这段代码应该是绝对正确的,如果不是可以学习的Java用法的最佳示例之一的话。但这甚至不能编译


更新:我将java包导出到单个项目中,删除了java包默认导入以避免可能的名称空间冲突,并使用JVM 1.6.0来构建它。

这里的问题是泛型规范随着时间的推移而不断发展。:|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);
publicGetAnnotation(类annotationClass)
//构造函数不是泛型类型。
私有静态字符串[]getAnnotationValue(构造函数){
ConstructorProperties annotation=constructor.getAnnotation(ConstructorProperties.class);

较旧的编译器会认为这是一个非泛型方法,因为构造函数不是泛型的。然而,较新的编译器会确定此方法是自包含的,并且该类是否为泛型类型并不重要。

哦,就泛型方法参数而言,JLS的实现存在着大量的混乱这可能是因为您发布的代码是用javac编译的,而不是用Eclipse(我认为Eclipse有一个更好但不正确的编译器)。这在Eclipse中编译:

private static String[] getAnnotationValue(Constructor<?> constructor) {
  ConstructorProperties annotation = 
    constructor.getAnnotation(ConstructorProperties.class);
看看我最近问的这个问题。它让我毛骨悚然:


我肯定会在Eclipse中查找错误

编译时使用的Java版本是什么?请注意,软件中可能总是有错误,即使它的质量很高——毕竟它是软件,不可能100%无错误。它怀疑Oracle会提供不可编译的代码(但谁知道呢,errare humanum est;))-因此,请查看您的构建环境与他们的构建环境之间的差异。代码库中的几乎所有代码都是一个好的示例,但也有很多不好的示例:(@Peter Well在某种程度上,我认为每个大型项目都是如此。JDK源代码和API设计对于他们的年龄来说相当不错,事实上1.0 API必须在很短的时间内设计出来(现在希望没有人将cloneable实现视为伟大的体系结构设计的典范)@Voo,JDK也有很大一部分来自第三方库,其中一些库使用生成的代码,生成了丑陋的代码,这些代码已经为最佳实践更新了一段时间。例如,有一个类名为com.sun.java.swing.plaf.nimbus.InternalFrameInternalFrameTitlePaneMaximizeButtonWindowNotFocusedStates添加了详细信息关于要发布的编译器。我能为Eclipse在这种情况下正确工作做些什么吗?我不会尝试重新编译整个JDK(在src.zip中只完成了大约95%),只需重新编译您感兴趣的类(不要说全部;)。您可以使用Sun/Oracle编译器编译其源代码,更改代码以使其在Eclipse中编译,或者获取IBM JDK源代码。我将该项目与java包一起使用,而不是整个JDK。不过,感谢您提供有关更改编译器的建议!我将在谷歌上搜索它。我仍在寻找在Eclipse中更改编译器的方法,但我刚刚意识到这一点这不可能是全部——那么未实现的抽象方法呢?我有Java 6 update 25,它在第255行实现了该方法。也许您想看看用于Java 6 update 26的src.zip(最新版本)还有未实现的抽象方法呢?这个错误与泛型无关。这个错误我无法重现。我的JDK中没有方法
AWTAccessor.AWTEventAccessor.getAccessControlContext(AWTEvent)
private static String[] getAnnotationValue(Constructor constructor) {
  ConstructorProperties annotation = 
    constructor.getAnnotation(ConstructorProperties.class);