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> []的类型保证。

59539500

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React 学习笔记 —— Ref Hook

用以下三种方式创建 Ref 都可以 import React from reactexport default function Count () {const [count ,setCount] React.useState(0)const myRef React.createRef()const myRef2 React.useRef() // Ref Hook 的方式const myRef3 {current: undefined}const addNumber…

MFC消息机制

MFC消息机制 MFC消息机制涉及许多知识&#xff0c;比如消息分类&#xff0c;消息映射等。知识先了解一下&#xff0c;马上动手实践才是硬道理。我建了个SDI项目&#xff0c;把常用的消息试验了一遍。如果像我一样初学的&#xff0c;可以留下邮箱索取源码。// MainFrm.h afx_msg…

带Lambda表达式的Apache Wicket

这是怎么回事&#xff1f; :) 我一直在从事一些项目&#xff0c;这些项目值得庆幸的是将Apache Wicket用于表示层。 我自然想到Java的8个lambda表达式如何与Wicket完美匹配。 而不仅仅是我&#xff0c; Wicket团队似乎已经在努力更改API&#xff0c;以为开箱即用的lambda提供支…

React 父组件和子组件中的方法相互调用

目录父组件调用子组件方法子组件调用父组件方法父组件调用子组件方法 父组件中调用子组件的getTree方法 父组件 setFormValue()>{this.TreeList.getTree}<TreeList onSelect{this.setFormValue} onRef{(ref) > { this.TreeList ref }} />子组件 componentDidMount…

元素在父元素内垂直居中的思路

1.使用表格 的垂直居中特性 2.div的绝对定位 已知高度的情况下比较好弄. 3.用背景实现.前景元素visibility:hidden; 4.父元素table-cell 5.line-height 图片会跟随文字垂直居中.转载于:https://www.cnblogs.com/fumj/archive/2013/03/27/2984623.html

装饰者模式如何拯救了我的一天

在工作中&#xff0c;我正在处理庞大的Java代码库&#xff0c;该代码库是由许多不同的开发人员在15年的时间里开发的。 并不是所有的事情都由书来完成&#xff0c;但是同时我通常没有机会重构遇到的每一个奇怪之处。 尽管如此&#xff0c;仍可以每天采取提高代码质量的措施。 …

【虚拟主机篇】asp页面实现301重定向方法

301重定向在很多地方都需要用到&#xff0c;也是seo中常见的问题。比如确定首选域或更换网站域名的时候都要用到301重定向。301重定向的方法有好几种&#xff0c;拿ASP类网站来说有&#xff1a;首页301重定向和全站301重定向。 首页301重定向的方法&#xff1a; <% website…

快速的骆驼和云消息传递

Apache Camel是一个流行的&#xff0c;成熟的开源集成库。 它实现了企业集成模式 &#xff0c;这是在集成分布式系统时经常出现的一组模式。 过去&#xff0c;我写过很多关于Camel的文章&#xff0c; 包括为什么我比Spring Integration更喜欢它 &#xff0c; 路由引擎 如何 工作…

antd react dva在model中使用另一个model的state值

const oldData yield select(({ baseDictionary }) > {return ([...customPageSetting.list,]) });

三角形类1

/* 程序的版权和版本声明部分 Copyright (c)2012, 烟台大学计算机学院学生 All rightsreserved. 文件名称&#xff1a; object.cpp 作者&#xff1a;刘清远 完成日期&#xff1a; 2013年3月29日 版本号&#xff1a; v1.0 输入描述&#xff1a;无 问题描述&#xff1a;设计求三…

不可将您的方法命名为“等于”

&#xff08;当然&#xff0c;除非您确实重写了Object.equals() &#xff09;。 我偶然发现了用户Frank的一个非常奇怪的Stack Overflow问题 &#xff1a; 为什么Java的Area&#xff03;equals方法不能覆盖Object&#xff03;equals&#xff1f; 有趣的是&#xff0c;有一个A…

C#GRPC 服务端与客户端通信,故障排除记录

文章目录前言一、问题一解决方法二、问题二解决方法前言 第一次建立GRPC服务端&#xff0c;客服端一直通不到服务端&#xff1b; 问题1&#xff1a; One or more errors occurred. (Status(StatusCodeInternal, Detail"Error starting gRPC call. HttpRequestException:…

青禾BBS数据库查询语句(动网)

数据字典&#xff1a;http://files.cnblogs.com/ahauzyy/dvbbs.rar 查询用户信息: SELECT * FROM dbo.Dv_User WHERE UserName茗迹 查询用户发帖总数: SELECT UserTopic FROM dbo.Dv_User WHERE UserName茗迹 查询用户被删的帖子数&#xff1a; SELECT UserDel FROM dbo.Dv_Us…

EE JSP:Servlet的反向外套

仅当页面数量少或需要精确控制生成的内容&#xff08;二进制PDF等&#xff09;时&#xff0c;才可以从Servlet生成HTML。 对于大多数应用程序&#xff0c;输出将是HTML&#xff0c;我们需要一种更好的方法来完成此操作。 这就是JSP&#xff08;Java服务器页面&#xff09;出现的…

moment 24小时与12小时区别

moment(values.data).format(YYYY-MM-DD HH:mm:ss)--------------24小时 moment(values.data).format(YYYY-MM-DD hh:mm:ss)--------------12小时主要取决于format中的时分秒的大小写

android 自定义xml属性

Android 自定义组件 Android 提供了非常精致的和非常强大的组件化模型&#xff0c;能够更加方便的构建UI,这些UI组件都是基于基本的layout类:View 和 ViewGroup。 部分能够用的widgets包括&#xff1a;Button&#xff0c;TextView,EditText,ListView,CheckBox&#xff0c;Radio…

Neo4j:带密码的TF / IDF(和变体)

几周前&#xff0c;我写了一篇博客文章&#xff0c;介绍了如何使用scikit-learn在HIMYM成绩单上运行TF / IDF&#xff0c;以按情节找到最重要的短语&#xff0c;然后我很好奇在Neo4j中很难做到。 我首先将Wikipedia的TF / IDF示例之一翻译为cypher&#xff0c;以查看该算法的外…

验证码的设计,随机数的生成

只要将charNum改变就可以自定义设计生成随机数的个数。 //获取验证码的代码 void GetValidateCode() { validStr ""; Random rd new Random(); //创建随机数对象 //产生由 charNum 个字母或数字组成的一个字符串 …

There are multiple modules with names that only differ in ca

react antd 警告错误 原因&#xff1a;引用组件的大小写 // 原代码&#xff1a; import AddOrEditFrom from /components/Process/AddOrEditFrom; // 修改后代码 import AddOrEditFrom from /components/Process/AddOrEditFrom;

每个人都必须阅读的10篇Java文章

一个月前&#xff0c;我们发布了每个人都必须阅读的10篇SQL文章列表。 我们相信jOOQ博客上的文章列表将为我们的读者带来非凡的价值。 jOOQ博客是同时关注Java和SQL的博客&#xff0c;因此&#xff0c;一个月后的今天&#xff0c;我们发布了同样令人兴奋的10条Java文章列表&…