@SafeVarargs 使用说明

简介: @SafeVarargs 是jdk1.7引入的适用于可变参数与泛型能够更好结合的一个注解。 @SuppressWarnings 产生编译期警告的示例代码

说明:

@SafeVarargs 是jdk1.7引入的适用于可变参数与泛型能够更好结合的一个注解。

@SuppressWarnings 产生编译期警告的示例代码

官方解释:

程序员认定带有注释的主体或者构造函数不会对其执行潜在的不安全操作将此注释应用于未经检查的方法或者构造器在"不可具体化"的和未经检查的参数类型警告关于所有数组参数创建的时候

除了强加使用@Target 元注解的限制之外,编译器还被用在注解类型上来实现额外的限制下面几种情况会在使用@SafeVarags 注解的时候产生编译时错误:在声明一个固定参数的方法或者构造函数的时候

也就是说如果你认为你的方法或者构造方法是类型安全的,那么你也就可以使用@SafeVarargs 来跳过@SuppressWarnings("unchecked")检查。

示例:

publicclassSafeVarargs{
   // 这其实不是一个安全的类型检查
   @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
       Strings=lists[0].get(0);
  }
   public static void main(String[] args) {
       List<String>list1=Arrays.asList("one","two");
       m(list1);
  }
}


Exceptioninthread"main"java.lang.ClassCastException: java.lang.Integercannotbecasttojava.lang.String

atjava7.SafeVarargs.m(SafeVarargs.java:14)
atjava7.SafeVarargs.main(SafeVarargs.java:21)
Processfinishedwithexitcode1


具体分析:

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

Strings=lists[0].get(0);

我们预期的结果应该是取的值是42,但是实际上却报出了ClassCastException

因为最后array[0] 中的值 42Integer 类型, 无法直接用String 对象进行接受,所以会报错。


            </div>
目录
相关文章
|
监控 安全 Java
SpringBoot-开启Admin监控服务
本文介绍如何在SpringBoot项目中开启Admin监控服务。
467 0
|
5月前
|
人工智能 数据库 云计算
🔥躺着赚佣金!阿里云推荐计算巢服务让你轻松"带货"云计算
阿里云推出“推荐服务赚佣金”计划,无需技术背景,分享链接即可轻松赚取额外收入。高达20%佣金,200+精选服务任选,实时追踪收益,适合个人推广的数字副业!
499 9
|
机器学习/深度学习 算法
【机器学习系列】- 准确率、召回率、F1值的思考
关于如何评估算法,我们常通过准确率、召回率和F1值进行评估。
2863 0
【机器学习系列】- 准确率、召回率、F1值的思考
|
5月前
|
运维 监控 负载均衡
高效运维实践:常见问题的应对策略与实践经验
本文探讨了运维工作中的五大核心挑战及应对策略,涵盖负载均衡优化、数据库性能提升、系统监控预警、容器化与微服务运维等方面,旨在帮助企业提升系统稳定性与运维效率。
|
8月前
|
存储 自然语言处理 文件存储
|
数据库
达梦数据库最大连接数处理
达梦数据库最大连接数处理
546 0
|
Linux
7.1.9 【Linux】XFS 文件系统简介
7.1.9 【Linux】XFS 文件系统简介
464 0
|
开发框架 .NET C#
使用C#进行.NET框架开发:深入探索与实战
【5月更文挑战第28天】本文探讨了C#在.NET框架中的应用,展示了其作为强大编程语言的特性,如类型安全、面向对象编程。C#与.NET框架的结合,提供了一站式的开发环境,支持跨平台应用。文中介绍了C#的基础知识,如数据类型、控制结构和面向对象编程,以及.NET的关键技术,包括LINQ、ASP.NET和WPF。通过一个实战案例,展示了如何使用C#和ASP.NET开发Web应用,包括项目创建、数据库设计、模型和控制器编写,以及视图和路由配置。本文旨在揭示C#在.NET开发中的深度和广度,激发开发者探索更多可能性。
|
存储 算法 数据挖掘
服务器数据恢复—拯救raid5阵列数据大行动,raid5数据恢复案例分享
**Raid5数据恢复算法原理:** 分布式奇偶校验的独立磁盘结构(被称之为raid5)的数据恢复有一个“奇偶校验”的概念。可以简单的理解为二进制运算中的“异或运算”,通常使用的标识是xor。运算规则:若二者值相同则结果为0,若二者结果不同则结果为1。 例如0101 xor 0010根据上述运算规则来计算的话二者第一位都是0,两者相同,结果为0 ;第二、三、四位的数值不同则结果均为1,所以最终结果为0111。公式表示为:0101 xor 0010 = 0111,所以在 a xor b=c 中如果缺少其中之一,我们可以通过其他数据进行推算,这就是raid5数据恢复的基本原理。 了解了这个基本原理
|
人工智能 Java API
Java中的智能语音识别与处理技术实践
Java中的智能语音识别与处理技术实践

热门文章

最新文章