Java旧版不断发展
我最近偶然发现了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中记录。 就在昨天,我们在Map
和ConcurrentHashMap
记录了与全新API相关的新警告 。
“管理权:发人深省”,关于所有这些警告以及Brian Goetz维护这些警告的难易程度的很好演讲可以在这里看到:
演讲摘要:
语言设计师谈论他们正在设计的语言时
翻译自: https://www.javacodegeeks.com/2015/03/the-java-legacy-is-constantly-growing.html
Java旧版不断发展相关推荐
- linux暗转旧版java_Java旧版不断发展
linux暗转旧版java 最近,我偶然发现了JDK API的一个非常有趣的警告,即Class.getConstructors()方法. 它的方法签名是这样的: Constructor<?> ...
- java旧版下载地址_Java下载 - 最新版、历史版本的官方下载地址
Java下载 - 最新版.历史版本的官方下载地址 2015-07-31·WeaponX 4114 次浏览 ## 最新版下载 ### 最新版Java下载地址 [http://www.oracle.com ...
- 旧版java_Java旧版本清理|JavaRa旧版本清理下载_V2.4 官方版_9号软件下载
JavaRa 是一款非常实用的Java旧版清理工具,可以帮你检查目前系统安装的 Java 是否为最新版本,并且自动移除最新版本以外的所有旧版本,让这些旧版可以不要再占据硬盘的空间了. 软件特点: 1. ...
- Java学习从入门到精通-旧版
为什么80%的码农都做不了架构师?>>> Java学习从入门到精通-旧版 http://tech.ccidnet.com/art/3737/20051017/465333_1. ...
- java ee的小程序_用微服务和容器替换旧版Java EE应用程序服务器
java ee的小程序 Lightbend最近对2000多个JVM开发人员进行了一项调查,结果刚刚发布. 开展该调查的目的是发现:发展趋势与IT基础架构趋势之间的相关性,处于数字化转型前沿的组织如何使 ...
- 用微服务和容器替换旧版Java EE应用程序服务器
Lightbend最近对2000多个JVM开发人员进行了调查,结果刚刚发布. 开展该调查的目的是发现:发展趋势与IT基础设施趋势之间的相关性,处于数字化转型前沿的组织如何使他们的应用程序现代化以及当今 ...
- Java 8 Friday:让我们弃用那些旧版库
在Data Geekery ,我们喜欢Java. 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋. Java 8星期五 每个星期 ...
- ie开始屏蔽旧的java插件_IE将開始屏蔽旧版ActiveX控件
微软IE团队上周宣布将在IE中屏蔽旧版本号的ActiveX控件以加强IE的安全性.首先会被禁用的旧版本号ActiveX控件包括: J2SE 1.4, 低于update 43 的版本号 J2SE 5.0 ...
- ie开始屏蔽旧的java插件_IE将开始屏蔽旧版ActiveX控件
微软IE团队上周宣布将在IE中屏蔽旧版本的ActiveX控件以加强IE的安全性,首先会被禁用的旧版本ActiveX控件包括: J2SE1.4, 低于update 43 的版本 J2SE5.0, 低于u ...
最新文章
- ruby require的使用
- RabbitMQ详细文档
- SOAP和HTTP 两种基本传输协议
- Spring MVC 数据验证——validate注解方式
- python tensorflow tf.layers.max_pooling2d() 2维输入(例如图像)的最大池化层
- 为什么乱码:meta http-equiv=content-type前的非ANSI字符
- 惠普110a硒鼓加粉步骤_惠普打印机加粉教程(88a硒鼓/36a硒鼓/78a硒鼓)
- 硬盘是计算机的储存器,硬盘存储器
- 认识自己,曾经的选择,是否如愿?一位渗透测试工程师的自述感言!!!
- 340页11万字智慧政务大数据资源平台大数据底座数据治理建设方案
- git使用及上传代码到github
- 重启mysql的cmd命令
- 微信小程序:音乐播放器带进度条
- udf开发入门(python udf、hive udf)
- 声学——声源定位阅读笔记
- NLP实战:面向中文电子病历的命名实体识别
- 元素在锚点定位后始终在页面居中显示的方法
- 还原分区失败怎么办?为什么会出现还原分区失败
- 业务对话机器人Rasa核心算法DIET及TED论文详解
- linux驱动开发篇(四)—— platform平台设备驱动