我最近偶然发现了JDK API的一个非常有趣的警告,即Class.getConstructors()方法。 它的方法签名是这样的:

Constructor<?>[] getConstructors()

有趣的是, Class.getConstructor(Class...)返回一个Constructor<T> ,并保持了<T>

Constructor<T> getConstructor(Class<?>... parameterTypes)

为什么会有区别,即为什么第一个方法不返回Constructor<T>[]

让我们考虑一下Javadoc:

请注意,尽管此方法返回一个Constructor <T>对象的数组(也就是此类的构造函数的数组),但此方法的返回类型为Constructor <?> [],而不是Constructor <T> []。预期。 这种信息量较少的返回类型是必需的,因为从此方法返回后,可以修改该数组以容纳不同类的Constructor对象,这将违反Constructor <T> []的类型保证。

这是一个艰难的过程。 从历史上看,这是怎么发生的:

Java 1.0 / Oak:数组

在Java 1.0( Oak编程语言的直接继承者)中,已经引入了数组。 实际上,它们是在Java 1.2中引入的collections API之前引入的。 数组遭受着我们今天所知道的所有问题,包括它们的协变,这在运行时导致了很多问题,这些问题在编译时无法检查:

Object[] objects = new String[1];
objects[0] = Integer.valueOf(1); // Ouch

Java 1.1:反射API

缺少“不错的” collection API, Class.getConstructors()方法唯一可能的返回类型是Constructor[] 。 当时的合理决定。 当然,您可能会犯上述相同的错误:

Object[] objects = String.class.getConstructors();
objects[0] = Integer.valueOf(1); // Ouch

但是除了上述内容之外,您还可以正确地编写以下代码:

Constructor[] constructors  = String.class.getConstructors();
constructors[0] = Object.class.getConstructor();// Muahahahahahahaha

Java 1.2:Collections API

Java从很早的时候就一直向后兼容,甚至从Oak开始。 到目前为止,在这个Stack Overflow问题中,关于Oak的一些向后兼容性已泄漏到Java中,这是一个非常有趣的历史研究。

虽然使用集合来设计反射API是很自然的,但是现在已经为时已晚。 更好的解决方案可能是:

List getConstructors()

但是,请注意,我们还没有泛型,因此数组实际传达的类型信息比集合多。

Java 1.5:泛型

在Java 5中,

Constructor[] getConstructors()

Constructor<?>[] getConstructors()

已经出于上述原因进行了处理。 现在,使用集合的替代API肯定会更好:

List<Constructor<T>> getConstructors()

但是船开了。

Java,丑陋的疣

Java充满了这些小警告。 它们都记录在Javadocs中,并且经常在Stack Overflow中记录。 就在昨天,我们在MapConcurrentHashMap记录了与全新API相关的新警告 。

“管理权:发人深省”,关于所有这些警告以及Brian Goetz维护这些警告的难易程度的很好演讲可以在这里看到:

演讲摘要:

语言设计师谈论他们正在设计的语言时

翻译自: https://www.javacodegeeks.com/2015/03/the-java-legacy-is-constantly-growing.html

Java旧版不断发展相关推荐

  1. linux暗转旧版java_Java旧版不断发展

    linux暗转旧版java 最近,我偶然发现了JDK API的一个非常有趣的警告,即Class.getConstructors()方法. 它的方法签名是这样的: Constructor<?> ...

  2. java旧版下载地址_Java下载 - 最新版、历史版本的官方下载地址

    Java下载 - 最新版.历史版本的官方下载地址 2015-07-31·WeaponX 4114 次浏览 ## 最新版下载 ### 最新版Java下载地址 [http://www.oracle.com ...

  3. 旧版java_Java旧版本清理|JavaRa旧版本清理下载_V2.4 官方版_9号软件下载

    JavaRa 是一款非常实用的Java旧版清理工具,可以帮你检查目前系统安装的 Java 是否为最新版本,并且自动移除最新版本以外的所有旧版本,让这些旧版可以不要再占据硬盘的空间了. 软件特点: 1. ...

  4. Java学习从入门到精通-旧版

    为什么80%的码农都做不了架构师?>>>    Java学习从入门到精通-旧版 http://tech.ccidnet.com/art/3737/20051017/465333_1. ...

  5. java ee的小程序_用微服务和容器替换旧版Java EE应用程序服务器

    java ee的小程序 Lightbend最近对2000多个JVM开发人员进行了一项调查,结果刚刚发布. 开展该调查的目的是发现:发展趋势与IT基础架构趋势之间的相关性,处于数字化转型前沿的组织如何使 ...

  6. 用微服务和容器替换旧版Java EE应用程序服务器

    Lightbend最近对2000多个JVM开发人员进行了调查,结果刚刚发布. 开展该调查的目的是发现:发展趋势与IT基础设施趋势之间的相关性,处于数字化转型前沿的组织如何使他们的应用程序现代化以及当今 ...

  7. Java 8 Friday:让我们弃用那些旧版库

    在Data Geekery ,我们喜欢Java. 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋. Java 8星期五 每个星期 ...

  8. ie开始屏蔽旧的java插件_IE将開始屏蔽旧版ActiveX控件

    微软IE团队上周宣布将在IE中屏蔽旧版本号的ActiveX控件以加强IE的安全性.首先会被禁用的旧版本号ActiveX控件包括: J2SE 1.4, 低于update 43 的版本号 J2SE 5.0 ...

  9. ie开始屏蔽旧的java插件_IE将开始屏蔽旧版ActiveX控件

    微软IE团队上周宣布将在IE中屏蔽旧版本的ActiveX控件以加强IE的安全性,首先会被禁用的旧版本ActiveX控件包括: J2SE1.4, 低于update 43 的版本 J2SE5.0, 低于u ...

最新文章

  1. ruby require的使用
  2. RabbitMQ详细文档
  3. SOAP和HTTP 两种基本传输协议
  4. Spring MVC 数据验证——validate注解方式
  5. python tensorflow tf.layers.max_pooling2d() 2维输入(例如图像)的最大池化层
  6. 为什么乱码:meta http-equiv=content-type前的非ANSI字符
  7. 惠普110a硒鼓加粉步骤_惠普打印机加粉教程(88a硒鼓/36a硒鼓/78a硒鼓)
  8. 硬盘是计算机的储存器,硬盘存储器
  9. 认识自己,曾经的选择,是否如愿?一位渗透测试工程师的自述感言!!!
  10. 340页11万字智慧政务大数据资源平台大数据底座数据治理建设方案
  11. git使用及上传代码到github
  12. 重启mysql的cmd命令
  13. 微信小程序:音乐播放器带进度条
  14. udf开发入门(python udf、hive udf)
  15. 声学——声源定位阅读笔记
  16. NLP实战:面向中文电子病历的命名实体识别
  17. 元素在锚点定位后始终在页面居中显示的方法
  18. 还原分区失败怎么办?为什么会出现还原分区失败
  19. 业务对话机器人Rasa核心算法DIET及TED论文详解
  20. linux驱动开发篇(四)—— platform平台设备驱动

热门文章

  1. Hibernate中使用Criteria查询及注解——(Dept.java)
  2. 动态代理JDK于cglib
  3. 在idea 中添加和删除模块Module
  4. shell脚本启动kafka集群的多台节点
  5. java字节码指令简介(仅了解)
  6. Java 流式编程stream
  7. 匿名内部类与Lambda表达式习题
  8. apache.camel_Apache Camel 3.1 –更多骆驼核心优化(第3部分)
  9. 堆栈溢出 java_堆栈溢出回答了我们所不知道的Java首要问题
  10. aws实例启动失败_AWS:启动安装了APOC的Neo4j实例