说明:

@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 使用说明的更多相关文章

  1. Atitit.项目修改补丁打包工具 使用说明

    Atitit.项目修改补丁打包工具 使用说明 1.1. 打包工具已经在群里面.打包工具.bat1 1.2. 使用方法:放在项目主目录下,执行即可1 1.3. 打包工具的原理以及要打包的项目列表1 1. ...

  2. awk使用说明

    原文地址:http://www.cnblogs.com/verrion/p/awk_usage.html Awk使用说明 运维必须掌握的三剑客工具:grep(文件内容过滤器),sed(数据流处理器), ...

  3. “我爱背单词”beta版发布与使用说明

    我爱背单词BETA版本发布 第二轮迭代终于画上圆满句号,我们的“我爱背单词”beta版本已经发布. Beta版本说明 项目名称 我爱背单词 版本 Beta版 团队名称 北京航空航天大学计算机学院  拒 ...

  4. Oracle 中 union 和union all 的简单使用说明

    1.刚刚工作不久,经常接触oracle,但是对oracle很多东西都不是很熟.今天我们来了解一下union和union all的简单使用说明.Union(union all): 指令的目的是将两个 S ...

  5. Map工具系列-02-数据迁移工具使用说明

    所有cs端工具集成了一个工具面板 -打开(IE) Map工具系列-01-Map代码生成工具说明 Map工具系列-02-数据迁移工具使用说明 Map工具系列-03-代码生成BySQl工具使用说明 Map ...

  6. Map工具系列-03-代码生成BySQl工具使用说明

    所有cs端工具集成了一个工具面板 -打开(IE) Map工具系列-01-Map代码生成工具说明 Map工具系列-02-数据迁移工具使用说明 Map工具系列-03-代码生成BySQl工具使用说明 Map ...

  7. jQuery验证控件jquery.validate.js使用说明

    官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation jQuery plugin: Validation 使用说明 转载 ...

  8. gdbsever 使用说明

    gdbsever 使用说明 在新塘N3292x平台下 编译 gdbsever ./configure --target=arm-linux --host=arm-linux arm-linux-gdb ...

  9. mongoVUE的增删改查操作使用说明

    mongoVUE的增删改查操作使用说明 一. 查询 1. 精确查询 1)右键点击集合名,再左键点击Find 或者直接点击工具栏上的Find 2)查询界面,包括四个区域 {Find}区,查询条件格式{& ...

随机推荐

  1. MFC中的CListControl控件

    一直想要这种效果,无奈刚开始用了cListbox控件,不知道怎么生成背景的边框,找了好久资料,突然发现好像控件用错了. 用CListControl控件实现图中效果,超级开心~ 实现过程: 添加一个Li ...

  2. HP DL380 G5 安装操作系统流程

    1.准备服务器引导盘,设置光盘启动.注意:会将服务器所有数据清除 2.依据引导盘选择需要的安装系统 3.插入系统安装光盘.ps:若kvm等远程工具无法插入光盘,需要插入物理介质的安装光盘

  3. ASP.NET Web Application中使用链接文件

    最近重构一个内部的平台系统,作为一个平台,其下有几个子系统,每个子系统有自己的网站系统.而每个网站使用的是统一的风格,统一的验证机制,反馈系统,等等.所以,为了避免几个子系统中重复出现相同的资源或文件 ...

  4. Appium+python自动化-appium元素定位

    前言 appium定位app上的元素,可以通过id,name.class这些属性定位到 一.id定位 1.appium的id属性也就是通过UI Automator工具查看的resource-id属性

  5. ubuntu 转换图片格式的方法(sam2p, imagemagick)

    (1) 终端:sudo apt-get install sam2p sam2p [原图片名.格式] [目标图片名.格式] 即可在同一目录下生成目标图片格式 (2) 终端: sudo apt-get i ...

  6. JS事件兼容性

    事件代理的时候,使用事件对象中的srcElement属性,获取触发元素.IE浏览器支持window.event.srcElement , 而firefox支持window.event.target. ...

  7. BZOJ 3282 Tree ——Link-Cut Tree

    [题目分析] 明显的LCT维护连通性的题目. access的操作是比较巧妙的,可以把结点到根变成偏爱路径,而且保证了该点是链上深度最深的点. 而且需边的思想也很巧妙,保证了复杂度. 但是只能用于修改路 ...

  8. Virtual Box 安装过程(卸载Vmware后)

    VirtualBox安装前的操作:(或许某些操作不一定有用,但是我是这么做下来的,最后也安装成功了) 步骤一:停止之前安装的vmware的所有服务(如果之前没有安装过虚拟机软件,无需做此操作)VMwa ...

  9. mysql 插入replace改变原有数据某些字段

    完整原型:(主要看下面例子) replace into rpt_ci_cinema_seller_shift_dt ( BIZ_DATE,CINEMA_CD,SELLER_CD,LOCATION_CD ...

  10. css-包含块

    在CSS中,有事一个元素的位置和尺寸的计算都相对于一个矩形,这个矩形被称作包含块.包含块是一个相对的概念,比如 子元素的初始化布局总是在父元素的左上角,这就是一个相对的概念.其中父元素就是一个参照物, ...