技术标签: Effective Java 第三版翻译
可变参数方法(第53项)和泛型都在Java 5时添加到了平台中,所以你可能会期望它们会优雅地相互作用;可悲的是,它们不能相互作用。可变的目的是允许客户端将数量可变的参数传递给方法,但它是一个漏洞抽象( leaky abstraction):当你调用可变参数方法时,会创建一个数组来保存可变参数;该数组应该是一个实现细节,是可见的。因此,当可变参数具有泛型或者参数化类型时,会出现令人困惑的编译器警告。
回顾第28项,不可具体化类型(non-reifiable)是其运行时表示的信息少于其编译时表示的类型,并且几乎所有泛型和参数化类型都是不可恢复的。如果方法声明其可变参数为不可具体化类型,则编译器会在声明上生成警告。如果调用一个包含可变参数的方法时,推断其可变参数类型是不可具体化的,那么编译器也会对调用生成警告。警告如下所示:
warning: [unchecked] Possible heap pollution from
parameterized vararg type List<String>
当参数化类型的变量引用不属于该类型的对象时,会发生堆污染(Heap pollution )[JLS, 4.12.2]。它会导致编译器自动生成的数据类型转换失败,违反泛型类型系统的基本保证。例如,考虑这个方法,这是第127页上代码片段的一种伪装变体:
// Mixing generics and varargs can violate type safety!
static void dangerous(List<String>... stringLists) {
List<Integer> intList = List.of(42);
Object[] objects = stringLists;
objects[0] = intList; // Heap pollution
String s = stringLists[0].get(0); // ClassCastException
}
该方法没有可见(visible)的数据类型转换,但是在使用一个或多个参数调用时抛出ClassCastException。它的最后一行有一个由编译器生成的不可见转换。这种转换失败,说明类型安全性已经受到损害,并且在一般的可变参数数组中存储值是不安全的。
这个例子引出了一个有趣的问题:为什么使用泛型可变参数声明方法是合法的,而显示创建泛型数组是非法的?换句话说,为什么前面显示的方法只生成警告,而127页的代码片段生成错误?答案是,带有泛型或参数化类型的可变参数的方法在实践中非常有用,因此语言设计者选择了忍受这种不一致。事实上,Java库导出了好几个这样的方法,包括Arrays.asList(T... a)
, Collections.addAll(Collection<? super T> c, T... elements)
和EnumSet.of(E first, E... rest)
。跟前面显示的危险方法不用,这些库方法都是类型安全的。
在Java 7之前,使用泛型可变参数的方法的作者无法处理调用点(call sites)上的警告。这使得这些API使用起来不愉快。用户必须忍受警告,或者最好在没个调用点使用@SuppressWarnings("unchedked)
注释消除警告(第27项)。这是乏味的,损害了可读性,并隐藏了标记真实问题的警告。
在Java 7中,SafeVarargs注释已经添加到平台中,从而允许具有泛型可变参数的方法的作者可以自动压制客户端警告。本质上,SafeVarargs注释代表了该方法
Nuxt.js 是什么?Nuxt.js 是一个基于 Vue.js 的通用应用框架。通过对客户端/服务端基础架构的抽象组织,Nuxt.js 主要关注的是应用的UI渲染。它的目标是创建一个灵活的应用框架,你可以基于它初始化新项目的基础结构代码,或者在已有 Node.js 项目中使用 Nuxt.js。Nuxt.js 预设了利用Vue.js开发服务端渲染的应用所需要的各种配置。除此之..._nuxt.js vue
1.规则如果Integer类型的两个数相等,如果范围在-128~127(默认),那么用“==”返回true,其余的范会false。两个基本类型int进行相等比较,直接用==即可。一个基本类型int和一个包装类型Integer比较,用==也可,比较时候,Integer类型做了拆箱操作。Integer类型比较大小,要么调用Integer.intValue()转为基本类型用“==”比较,要么直接用equals比较。Java Integer.compareTo()比较大小2.定义_javainteger比较大小
对于什么是全栈开发者并没有一个明确的定义。但是,有一件事是肯定的:2019 年对全栈开发者的需求量很大。在本文中,我将向你概述一些趋势,你可以尝试根据这些趋势来确定你可能要投入的时间。简单地说,全栈开发者就是可以构建完整应用程序的人。他们了解前端和后端技术、工具和服务,并结合所有这些技能开发出可以在生产环境中运行的东西。这是美国全栈开发者在 2019 年的工资走势:人生苦短,所以尽量少做无..._前端 别出了学不动了 表情包
欢迎淘宝搜索飞灵科技,我司相关新产品陆续上线。IEEE 1588硬件辅助可以使网络设备通过PTP协议实现高精度的时间同步。以TSync时钟同步开发板为例,它的网络MAC硬件支持高精度的PTP时钟,用于向报文提供硬件时间戳。两块开发板作为主时钟和从时钟同步之后,他们的PTP时钟时间是同步的,由PTP时钟产生的PPS秒脉冲信号应该是相位对齐的。示波器测量PPS信号主时钟接收GNSS的PPS和时间信息,同步到PTP主时钟上。再通过PTP网络协议,把时间信息同步给从时钟。所以实际用示波器测量主时钟上的GN._ts2phc用来和gps时间同步
将Excel数据写入字典cmd小测试打开cmd 转入Excel所在文件夹下再打开python,步骤如下: F:进入F盘cd 打开F盘下子目录导入所需要的库pandas df = pd.read_excel("data.xlsx")#读取Excelres = df.to_dict(orient = "record")#输出字典python中的数据类型数组:存放单一数据类型,有限个数据的变量数组操作列..._python列表中的字典形成两列写入excel
文件名称: C4.5下载 收藏√ [5 4 3 2 1]开发工具: matlab文件大小: 349 KB上传时间: 2017-03-14下载次数: 0提 供 者: 宋林详细说明:C4.5算法的matlab实现,里面有标准数据集作为实例进行演示-C4.5 algorithm matlab implementation, which has a standard data set as..._c4.5算法matlab实现
原文地址:https://blog.domenic.me/peer-dependencies/nodejs官网收录了这篇文章,地址是https://nodejs.org/en/blog/npm/peer-dependencies/作者是 Domenic Denicola ,就职于谷歌Chrome团队。github 上npm开源项目的参与者。在本文中我把 Peer Dependencie_peer依赖
计算机信息网络国际联网安全保护管理办法-----------------------------------------------------------------学习网络的必看的法律书籍--------------------------------计算机信息网络国际联网安全保护管理办法第一章总则..._《计算机信息网络国际互联网安全保护管理办法》第5条规定
盖茨比乔布斯Recently, Netlify has become one of the hotter topics in Web Development. They are loved in the community and just received millions of dollars of funding to continue making their product better...
go语言Windows编译问题最近使用windows做开发,不得不说,真的~~~~~~~~~~会带来很多不必要的麻烦。C:\Go\src\vendor\golang.org\x\crypto\chacha20poly1305\chacha20poly1305_amd64.go:13:2: C source files not allowed when not using cgo or SWIG: cpu_gccgo.c看到很多人说是因为go1.4-1.5升级的原因,但是我的是新电脑,第一次装gola_/usr/local/go/src/chacha20poly1305/chacha20poly1305_amd64.go:13:2: use of in
DX_TEXT()可以认为是把字符串变量和控件的内容关联起来; DDX_Control()可以认为是把变量和控件本身关联起来; DoDataExchange(pDX)就是处理所有变量与其关联控件交换数据的函数。DDX_TEXT()数据交换过程:UpdateData(TRUE);//将控件的内容传回 m_strName;m_strName = _T("关联变量");//修改值UpdateData(FALSE);//将m_strName的值显示到控件DDX_Control()数据交换过程:..
<script type="text/javascript"> //禁止鼠标右击 document.oncontextmenu = function() { event.returnValue = false; }; //禁用开发者工具F12 document.onkeydown = document.onkeyup = document.onkeypress = function( event ._浏览器禁用f12