为什么发布的Java源代码中存在错误?

时间:2011-07-04 15:05:07

标签: java

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

一些例子。

  

java.beans.MetaData,第1365行:

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

类型不匹配:无法从Annotation转换为ConstructorProperties

     

java.awt.AWTEvent,第220行:

AWTAccessor.setAWTEventAccessor(new AWTAccessor.AWTEventAccessor() {
     

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

我认为这段代码应该绝对正确,如果不是人们可以学习的最佳Java使用示例之一。但这甚至都没有编译!

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

2 个答案:

答案 0 :(得分: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);

较旧的编译器会认为这是一种非泛型方法,因为构造函数不是通用的。然而,较新的编译器识别此方法是自包含的,并且该类是否是非泛型类型无关紧要。

答案 1 :(得分: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中找到错误