我下载了用于研究的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构建它。
答案 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中找到错误