linux暗转旧版java_Java旧版不断发展
linux暗转旧版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
linux暗转旧版java
linux暗转旧版java_Java旧版不断发展相关推荐
- 旧版java_Java旧版本清理|JavaRa旧版本清理下载_V2.4 官方版_9号软件下载
JavaRa 是一款非常实用的Java旧版清理工具,可以帮你检查目前系统安装的 Java 是否为最新版本,并且自动移除最新版本以外的所有旧版本,让这些旧版可以不要再占据硬盘的空间了. 软件特点: 1. ...
- 小马哥----高仿HTC D816刷机拆机主板图与开机界面图 6582芯片1:1精仿 分新旧 移动版与联通版分别
高仿htc d816机型 6582芯片 TH55主板型号 14版与15版资料不通用 新版刷旧版开机定屏幕反复重启 具体拆机看主板标示贴或者进入工程模式对比基带版本来确定机型 上图
- 万字长文!Unix和Linux你不知道的那些历史(详解版)
作者 | 程序员小乐 来源 | 程序员小乐(ID:study_tech) 00 前言 UNIX 与 Linux 之间的关系是一个很有意思的话题.在目前主流的服务器端操作系统中,UNIX 诞生于 ...
- 万字长文!Unix 和 Linux 你不知道的那些历史(详解版)
点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 Everyone would get tired.Nobody can ta ...
- :linux内核编译过程的最终总结版
参考了linuxsir和水母的linux版的精华区,本人不保留任何版权. 经过归纳整理,看看上面的就可以了,包括补丁如何打.具体的一些选项可以往下看,一些一看就懂的白痴选项,并没有选进来,因此适合对电 ...
- linux内核支持硬盘,Intel 10nm桌面版还是来了:Linux内核已支持
Intel 10nm工艺处理器目前仅用于笔记本移动平台,而且只有U系列低功耗版.Y系列超低功耗版,甚至在此领域仍需要14nm产品来作为补充,再加上Ice Lake处理器频率偏低,初代10nm Cann ...
- linux命令后缀-d和 都表示后台启动,Linux复习材料_关宇亮整理版.doc
Linux复习材料_关宇亮整理版 Linux目录 第1章1.Linux的内核版与发行版的区别2.2个开发标准规范 4.常见的Linux发行版 5.Unix与Linux的关系与区别 6.Linux的特性 ...
- Linux下安装nginx (tar解压版安装) nginx1.16.1
https://blog.csdn.net/qq_40431100/article/details/104729504 Linux下安装nginx (tar解压版安装) nginx1.16.1 Jkc ...
- Linux学习之嵌入式Linux编程文件IO(C语言版)
Linux学习之嵌入式Linux编程文件IO(C语言版) 一.文件IO常用函数 1.open 2.write 3.read 示例代码: #include <sys/types.h> #in ...
最新文章
- 2013计算机大纲,2013计算机应用基础考试大纲
- 1231 sqlserver_sqlserver 删除表中 指定字符串
- jquery元素节点操作
- docker 安装azkaban_azkaban安装
- 到底ResNet在解决一个什么问题呢?知乎热门回答
- SaaS市场增长迅速 企业借CRM消灭管理黑洞
- 坐标系对应EPSG代号、经度范围、中央经线
- 【转载】三方框架整理
- SEO网站优化注意5个小细节,降低网站跳出率
- Verilog语言基础
- 初出茅庐的小李第73篇博客之offsetof(type, member-designator)使用
- 为什么深圳成指关注度远远小于上证指数?
- 御坂坂的C++学习之路(1)
- pip install av 无法安装
- win7 不显示图片缩略图(解决方法)
- 关于Java反射获取静态属性值的方式
- PHP5.4 如何连接MS Sql Server
- java 读取dwg_jdwglib java dwg文件的读取,写入开发包. dwg使用当前 常方便,测试代码和jar都有 CAD 247万源代码下载- www.pudn.com...
- 手把手教你设计机器视觉系统
- 屏幕下雪特效的jQuery实现
热门文章
- jzoj3339-[NOI2013模拟]wyl8899和法法塔的游戏【博弈论,暴力】
- E - Rotate and Flip(线性代数矩阵坐标变换)
- 【dfs】家族(jzoj 1985)
- GYM101933I - Intergalactic Bidding
- 动态规划训练8 [E - Multiplication Puzzle POJ1651]
- Lombok的@Data生成的hashCode和equals方法坑
- 跟我学 Java 8 新特性之 Stream 流(五)映射
- 面试官最爱问的并发问题
- 如何在MyEclipse中显示行数
- 小程序如何将wx.request里的数据传出去