@SafeVarargs 使用说明
说明:
@SafeVarargs 是jdk1.7引入的适用于可变参数与泛型能够更好结合的一个注解。
官方解释:
程序员认定带有注释的主体或者构造函数不会对其执行潜在的不安全操作
将此注释应用于未经检查的方法或者构造器在"不可具体化"的和未经检查的参数类型
警告关于所有数组参数创建的时候
除了强加使用@Target 元注解的限制之外,编译器还被用在注解类型上来实现额外的限制
下面几种情况会在使用@SafeVarags 注解的时候产生编译时错误:
在声明一个固定参数的方法或者构造函数的时候
也就是说如果你认为你的方法或者构造方法是类型安全的,那么你也就可以使用@SafeVarargs 来跳过@SuppressWarnings("unchecked")检查。
示例:
public class SafeVarargs {
// 这其实不是一个安全的类型检查
@SafeVarargs
static void m(List<String>...lists){
// 先会存储到 array[0] 的位置
Object[] array = lists;
List<Integer> tmpList = Arrays.asList(42);
// array[0] 又保存了tmpList(Integer)进行覆盖
// tmpList是一个List对象(类型已经擦除),赋值给Object类型的对象是允许的(向上转型),
// 能够编译通过
array[0] = tmpList;
// 实际取出来的应该是 42
String s = lists[0].get(0);
}
public static void main(String[] args) {
List<String> list1 = Arrays.asList("one","two");
m(list1);
}
}
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at java7.SafeVarargs.m(SafeVarargs.java:14)
at java7.SafeVarargs.main(SafeVarargs.java:21)
Process finished with exit code 1
具体分析:
List<String> list1 = Arrays.asList("one","two");
当程序执行到这一步,会创建一个list1 ,其内部存在两个固定的值 [one,two],
调用m(list1)方法
m(list1);
接着
Object[] array = lists;
程序执行到这一步,会在array数组中的第0个位置上存储一个list1 对象
List<Integer> tmpList = Arrays.asList(42);
创建一个Integer的列表,存储一个integer类型的元素42
array[0] = tmpList;
重新给array[0] 进行赋值,把原来位置的lists 进行覆盖,存储新的元素tmpList
String s = lists[0].get(0);
我们预期的结果应该是取的值是42,但是实际上却报出了ClassCastException
因为最后array[0] 中的值 42Integer 类型, 无法直接用String 对象进行接受,所以会报错。
参考: http://softlab.sdut.edu.cn/blog/subaochen/2017/04/safevarargs的用法/
http://book.51cto.com/art/201205/339154.htm
@SafeVarargs 使用说明的更多相关文章
- Atitit.项目修改补丁打包工具 使用说明
Atitit.项目修改补丁打包工具 使用说明 1.1. 打包工具已经在群里面.打包工具.bat1 1.2. 使用方法:放在项目主目录下,执行即可1 1.3. 打包工具的原理以及要打包的项目列表1 1. ...
- awk使用说明
原文地址:http://www.cnblogs.com/verrion/p/awk_usage.html Awk使用说明 运维必须掌握的三剑客工具:grep(文件内容过滤器),sed(数据流处理器), ...
- “我爱背单词”beta版发布与使用说明
我爱背单词BETA版本发布 第二轮迭代终于画上圆满句号,我们的“我爱背单词”beta版本已经发布. Beta版本说明 项目名称 我爱背单词 版本 Beta版 团队名称 北京航空航天大学计算机学院 拒 ...
- Oracle 中 union 和union all 的简单使用说明
1.刚刚工作不久,经常接触oracle,但是对oracle很多东西都不是很熟.今天我们来了解一下union和union all的简单使用说明.Union(union all): 指令的目的是将两个 S ...
- Map工具系列-02-数据迁移工具使用说明
所有cs端工具集成了一个工具面板 -打开(IE) Map工具系列-01-Map代码生成工具说明 Map工具系列-02-数据迁移工具使用说明 Map工具系列-03-代码生成BySQl工具使用说明 Map ...
- Map工具系列-03-代码生成BySQl工具使用说明
所有cs端工具集成了一个工具面板 -打开(IE) Map工具系列-01-Map代码生成工具说明 Map工具系列-02-数据迁移工具使用说明 Map工具系列-03-代码生成BySQl工具使用说明 Map ...
- jQuery验证控件jquery.validate.js使用说明
官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation jQuery plugin: Validation 使用说明 转载 ...
- gdbsever 使用说明
gdbsever 使用说明 在新塘N3292x平台下 编译 gdbsever ./configure --target=arm-linux --host=arm-linux arm-linux-gdb ...
- mongoVUE的增删改查操作使用说明
mongoVUE的增删改查操作使用说明 一. 查询 1. 精确查询 1)右键点击集合名,再左键点击Find 或者直接点击工具栏上的Find 2)查询界面,包括四个区域 {Find}区,查询条件格式{& ...
随机推荐
- Python开发:面向对象
Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的. 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在 ...
- SPOJ - ADALIST,双端队列入门模板!
ADALIST - Ada and List 这道题时限6.5s,激动人心啊,好多人STL一顿乱写AC,哈哈,如果熟悉双端队列的话这道题其实是很水的. 题意:n个数的数列,然后接下来Q次操作,每次可以 ...
- 九度oj 题目1031:xxx定律 题目1033:继续xxx定律
题目描述: 对于一个数n,如果是偶数,就把n砍掉一半:如果是奇数,把n变成 3*n+ 1后砍掉一半,直到该数变为1为止. 请计算需要经过几步才能将n变到1,具体可见样例. 输入: ...
- BZOJ 2242 [SDOI2011]计算器 ——EXGCD/快速幂/BSGS
三合一的题目. exgcd不解释,快速幂不解释. BSGS采用了一种不用写EXGCD的方法,写起来感觉好了很多. 比较坑,没给BSGS的样例(LAJI) #include <map> #i ...
- P2085 最小函数值 (堆)
题目描述 有n个函数,分别为F1,F2,...,Fn.定义Fi(x)=Aix^2+Bix+Ci (x∈N*).给定这些Ai.Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个). ...
- Spoj-DWARFLOG Manipulate Dwarfs
Manipulate Dwarfs In a small village beyond seven hills and seven seas, Snow White lives together wi ...
- Spring Open Session In View
提出:session在应用层就关闭,所以持久化要在应用层,但是到了view层持久化则session已经关闭 解决:session延迟到view层再关闭 原理:session(整个requestScop ...
- dockerfile各种命令解析
1.ADD命令,如果ADD的是压缩包,ADD之后会自动进行解压.....
- STL学习笔记(五) 算法
条款30:确保目标区间足够大 条款31:了解各种与排序有关的选择 //使用unaryPred划分输入序列,使得unaryPred为真的元素放在序列开头 partition(beg, end, unar ...
- Spring学习之路——简单入门HelloWorld
Spring简单介绍 Spring是一个提供了解决J2EE问题的一站式框架. Spring的核心是反转控制,通过配置文件完成业务对象之间的依赖注入,他鼓励一个良好的习惯,就是注入对接口编程而不是对类编 ...