@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}区,查询条件格式{& ...
随机推荐
- jquery map.js
(function ($) { HashMap = function () { var index = 0; var content = ''; var keyV = new Array(); var ...
- [LoadRunner]LR性能测试结果样例分析
R性能测试结果样例分析 测试结果分析 LoadRunner性能测试结果分析是个复杂的过程,通常可以从结果摘要.并发数.平均事务响应时间.每秒点击数.业务成功率.系统资源.网页细分图.Web服务器资源. ...
- bootshiro---开源的后台管理框架--基于springboot2+ shiro+jwt的真正rest api资源无状态认证权限管理框架,开发人员无需关注权限问题,后端开发完api,前端页面配置即可
https://gitee.com/tomsun28/bootshiro
- Linux下文件打包与解包
打包(.tar): tar -cvf Pro.tar /home/lin/Pro #将/home/lin/Pro文件夹下的所有文件打包成Pro.tar 打解包(.tar.gz) tar -cv ...
- x86 保护方式 简介 一
80386 三种工作方式 实模式 保护模式和虚拟86模式 只有在保护方式下 全部32条地址线才有效 可以寻址高达4g字节的物理地址空间 超过1m的内存空间 被成为扩展的内存空 ...
- Ubuntu Software Center has closed unexpectly解决方案
打开软件中心Ubuntu Software Center的时候 出现crash report :The application Ubuntu Software Center has closed un ...
- Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) D. Field expansion
D. Field expansion time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- 九度oj 题目1091:棋盘游戏
题目描述: 有一个6*6的棋盘,每个棋盘上都有一个数值,现在又一个起始位置和终止位置,请找出一个从起始位置到终止位置代价最小的路径: 1.只能沿上下左右四个方向移动 2.总代价是没走一步的 ...
- SQL2012 分页(最新)
--提取分页数据,返回总记录数 ALTER procedure [dbo].[sp_Common_GetDataPaging_ReturnDataCount] ( @SqlString varchar ...
- 使用ANT将Android打包成Jar包
本文主要实现使用ANT,将Android项目打包成jar,为方便其他项目使用. ANT可以去官网下载(http://ant.apache.org/) 先介绍打包的步骤,打包脚本下方贴出 步骤: 1,将 ...