我下载了JDK源代码(6u23构建b5)用于研究,Eclipsed决定自动构建它。令人惊讶的是,它发现了错误。
一些例子。
java.beans.MetaData,第1365行:
ConstructorProperties annotation = constructor.getAnnotation(ConstructorProperties.class);
类型不匹配:无法从注释转换为ConstructorProperties
java.awt.AWTEvent,第220行:
AWTAccessor.setAWTEventAccessor(new AWTAccessor.AWTEventAccessor() {
新类型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);
较早的编译器会假定这是一个非泛型方法,因为构造方法不是泛型的。但是,较新的编译器会将此方法标识为自包含的,并且该类是否为泛型类型都没有关系。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句