@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>
目录
相关文章
|
2月前
|
机器学习/深度学习 缓存 算法
解密Qwen3三连发:强化学习新算法GSPO!
强化学习(RL)是提升语言模型推理与问题求解能力的关键技术。然而,现有算法如 GRPO 在长期训练中存在严重不稳定性,限制了性能提升。为此,我们提出 **Group Sequence Policy Optimization (GSPO)**,通过在序列层面定义重要性比率并进行优化,显著提升了训练效率与稳定性。GSPO 在 MoE 模型训练中表现出色,无需依赖复杂策略即可实现高效训练,简化了 RL 基础设施。该算法已成功应用于 Qwen3 系列模型,推动 RL scaling 边界,释放模型潜能。
331 0
|
2月前
|
人工智能 Shell 数据处理
轻松掌握C语言中的大小写字母转换
在C语言中,大小写字母转换具有重要实用价值,常用于数据处理、用户输入统一格式、输出规范风格及忽略大小写差异等场景。C语言提供了toupper()和tolower()函数进行大小写转换,分别将小写转大写和大写转小写。这些函数定义在头文件&lt;ctype.h&gt;中,能够提升程序的灵活性与实用性。掌握这些转换技巧,有助于实现字符串比较、文本处理等常见编程任务。
|
4月前
|
人工智能 安全 语音技术
幼师必备AI教学神器:AI大模型赋能幼儿园课堂
输入幼儿年龄、性别、个案情况概述等关键内容,一键快速生成五大领域评价、幼儿发展评价、幼儿区域活动评价、幼儿游戏评价等评价内容,助力教师高效科学开展幼儿评价工作。
|
开发者 人工智能 自然语言处理
欢迎使用通义灵码
灵码使用指南!一键收藏。
133527 0
|
11月前
|
网络协议 关系型数据库 MySQL
MySQL报ERROR 2002 (HY000)解决
通过上述步骤,可以有效地解决MySQL连接时出现的 `ERROR 2002 (HY000)`错误。这些步骤包括检查和启动MySQL服务、配置文件检查、套接字文件检查、日志文件分析、进程检查、防火墙设置、客户端配置和最终的MySQL重装。确保每个步骤都按顺序执行,有助于快速定位和解决问题,使MySQL服务器恢复正常运行。
7872 0
|
存储 自然语言处理 Python
Python中文词汇与英文词频统计
本文介绍了如何使用Python进行英文和中文词频统计。对于英文,借助内置库按空格分隔单词并处理特殊字符;对于中文,需安装jieba分词库。代码实现中,通过读取文件、分词、统计词频并输出到文件。运行时,通过命令行提供文本和结果文件路径。此技能在学术研究、语言分析和文本挖掘领域颇有价值。
Python中文词汇与英文词频统计
|
机器学习/深度学习 编解码 自然语言处理
重磅!新增 13 种 Transformer 方法,火速收藏
如今,Transformer 这把火已经烧到了计算机视觉领域,可以说成为今年最大的热点。本着全心全意为社区服务的精神,OpenMMLab 当然不会对此无动于衷。 为了方便大家研究学习,我们基于 MMCV ,在OpenMMLab 6个方向的 repo 中复现了 13 种基于 Transformer 的方法,快来看看有没有你需要的吧。
1028 0
重磅!新增 13 种 Transformer 方法,火速收藏
|
关系型数据库 MySQL 数据库
MySQL 启动 登录报错Job for mysqld.service failed because the control process exited with error code. See
MySQL 启动 登录报错Job for mysqld.service failed because the control process exited with error code. See
2020 1
|
SQL 分布式计算 Hadoop
利用Hive与Hadoop构建大数据仓库:从零到一
【4月更文挑战第7天】本文介绍了如何使用Apache Hive与Hadoop构建大数据仓库。Hadoop的HDFS和YARN提供分布式存储和资源管理,而Hive作为基于Hadoop的数据仓库系统,通过HiveQL简化大数据查询。构建过程包括设置Hadoop集群、安装配置Hive、数据导入与管理、查询分析以及ETL与调度。大数据仓库的应用场景包括海量数据存储、离线分析、数据服务化和数据湖构建,为企业决策和创新提供支持。
1671 1
|
Oracle Java 关系型数据库
【极光系列】windows安装JDK11详细教程
【极光系列】windows安装JDK11详细教程
2719 3