@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 对象进行接受,所以会报错。


相关文章
|
Web App开发 前端开发 数据库
推荐GitHub上开源的一款独立开发者出海技术栈和工具合集
推荐GitHub上开源的一款独立开发者出海技术栈和工具合集
631 0
|
12月前
|
资源调度 Java fastjson
maven中央仓库油猴脚本
这是一个用于 Maven 中央仓库的油猴脚本,帮助开发者在选择依赖时查看每个 Jar 包的 JDK 版本信息。通过该脚本,用户可以在 Maven 中央仓库的组件版本列表页和详情页看到每个版本的 JDK 编译信息,从而避免因版本不兼容导致的运行问题。脚本支持从油猴商店安装或自行编译安装,并提供多种实用功能,如 GAV 快速访问详情页和展开隐藏文本等。
280 79
|
应用服务中间件 Python 容器
ERROR [ntContainer#0-1] o.s.a.r.l.SimpleMessageListenerContainer 1917: Failed to check/redeclare aut
ERROR [ntContainer#0-1] o.s.a.r.l.SimpleMessageListenerContainer 1917: Failed to check/redeclare aut
589 0
|
算法 Java Maven
GeaFlow图计算快速上手之K-hop算法
随着年轻人的社交需求不断增长,各种社交软件应运而生,这些社交软件通常都会有好友推荐功能,根据六度分离理论,理想情况下,每个人通过6个人就可以跟所有人产生关联,因此K-hop算法(K跳算法)被用于实现好友推荐,现在让我们来尝试使用GeaFlow在5分钟内实现K-hop算法吧!
|
网络安全
ssh 避免首次登录输入yes
ssh初次登录某个主机时,出现如下提示 Are you sure you want to continue connecting (yes/no)? 1 如何去掉? 打开/etc/ssh/ssh_config,修改以下配置项 StrictHostKey...
3034 0
|
存储 弹性计算 运维
阿里云无影云电脑怎么买?阿里无影云电脑仅19.9元/月起
阿里云无影云电脑怎么买?阿里无影云电脑仅19.9元/月起,阿里云无影云电脑配置具体价格表,无影云桌面4核8G企业办公型云电脑可以免费使用3个月,无影云电脑地域不同价格不同,无影云电脑价格是由云桌面配置、云盘价格、互联网访问带宽价格、AD Connector 价格、桌面组共用桌面session 价格等费用组成
2383 2
|
机器学习/深度学习 算法 PyTorch
机器学习之PyTorch和Scikit-Learn第6章 学习模型评估和超参数调优的最佳实践Part 2
本节中,我们来看两个非常简单但强大的诊断工具,可帮助我们提升学习算法的性能:学习曲线和验证曲线,在接下的小节中,我们会讨论如何使用学习曲线诊断学习算法是否有过拟合(高方差)或欠拟合(高偏置)的问题。另外,我们还会学习验证曲线,它辅助我们处理学习算法中的常见问题。
650 0
机器学习之PyTorch和Scikit-Learn第6章 学习模型评估和超参数调优的最佳实践Part 2
|
机器学习/深度学习 传感器 算法
萤火虫优化算法(FA)附matlab代码
萤火虫优化算法(FA)附matlab代码
|
存储 缓存 安全
iLO初识
iLO(Integrated Lights-Out)是一种远程管理技术,用于管理和监视HPE ProLiant服务器。它是一种硬件和软件解决方案,可以让您通过网络远程访问服务器,而无需在现场进行物理访问。
806 0
|
中间件 Go 网络架构
Traefik Middleware 插件实践
话说,作为一款开源的边缘路由器,Traefik 或多或少算是一款比较牛逼的新生代组件,其不仅可以作为接入层组件,实现流量转发等相关功能,同时也可以支撑网关层的相关功能,尤其是 2.x 版本中的自定义中间件功能。
711 0