Java中优雅实现泛型类型的强制转换

在Java中经常遇到将对象强制转换成泛型类的情况:

Map<String, Object> data = Map.of("name", "XiaoMing","age", 17,"scores", List.of(80, 90, 70)
);List<Integer> scores = (List<Integer>) data.get("scores");
System.out.println(scores);

以上代码运行时不会报错,因为我们知道scores的值就是List<Integer>类型,但是IDE还是会在类型转换的地方报黄色波浪线警告:

在这里插入图片描述
那么如何消除这种警告呢?

最安全的方法,就是老老实实地校验并转换类型:

public static void main(String[] args) {Map<String, Object> data = Map.of("name", "XiaoMing","age", 17,"scores", List.of(80, 90, 70));List<Integer> scores = convertScores(data.get("scores"));System.out.println(scores);
}private static List<Integer> convertScores(Object obj) {if (obj instanceof List<?> list) {List<Integer> scores = new ArrayList<>();for (Object e : list) {if (e instanceof Integer i) {scores.add(i);} else {throw new RuntimeException("Type conversion error.");}}return scores;}throw new RuntimeException("Type conversion error.");
}

convertScores方法中对scores字段的类型以及列表中每个元素类型都做了校验,并在类型不匹配时抛出异常。这种方法虽然稳妥,但是非常麻烦。如果我们能确保scores的值一定是List<Integer>类型,则可以直接强制转换并加上@SuppressWarnings("unchecked")注解来消除警告:

public static void main(String[] args) {Map<String, Object> data = Map.of("name", "XiaoMing","age", 17,"scores", List.of(80, 90, 70));@SuppressWarnings("unchecked")List<Integer> scores = (List<Integer>) data.get("scores");System.out.println(scores);
}

@SuppressWarnings注解既可以加在整个main方法上,也可以加在局部变量scores 的声明上,但是为了避免掩盖其它类型转换错误,应尽可能缩小该注解的影响范围。

如果项目中有很多涉及到泛型的类型转换,则每处都要加@SuppressWarnings注解。为了减少重复代码,可以封装一个类型转换工具类CastUtils

public class CastUtils {@SuppressWarnings("unchecked")public static <T> T cast(Object obj) {return (T) obj;}
}

然后就可以使用CastUtils.cast来转换任意类型了:

public static void main(String[] args) {Map<String, Object> data = Map.of("name", "XiaoMing","age", 17,"scores", List.of(80, 90, 70));List<Integer> scores = CastUtils.cast(data.get("scores"));System.out.println(scores);
}

事实上,CastUtils可以用于任何需要强制类型转换的地方,而不发出任何编译器警告。当然,我们需要保证实际类型和目标类型匹配,否则会抛出java.lang.ClassCastException

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/830776.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET数据存储与交换系统设计

摘 要 该系统以Microsoft Visual Studio 2003作为开发工具&#xff0c;选用SQL Server 2000数据库来实现数据存储&#xff0c;并设计开发了一种基于B/S模式的数据存储与交换系统。该系统完成了用户注册管理、后台管理和用户空间管理功能&#xff1b;为每个用户提供了个人的存…

数据结构中的栈(C语言版)

一.栈的概念 栈是一种常见的数据结构&#xff0c;它遵循后进先出的原则。栈可以看作是一种容器&#xff0c;其中的元素按照一种特定的顺序进行插入和删除操作。 压栈&#xff1a;栈的插入操作叫做进栈/压栈/入栈&#xff0c;入数据在栈顶。 出栈&#xff1a;栈的删除操作叫做…

区块链技术:DAPP开发

随着科技的飞速发展&#xff0c;区块链技术逐渐渗透到各个领域&#xff0c;其中DAPP&#xff08;去中心化应用&#xff09;的发展尤为引人注目。作为一种新型的应用程序&#xff0c;DAPP正在重塑未来商业生态&#xff0c;其潜力无可估量。 一、DAPP的定义和特点 DAPP是指基于…

等保保护测评试题中

二、多选题 1、防火墙提供的接入模式中包括&#xff08;ABCD&#xff09; A.网关模式 B.透明模式 C.混合模式 D.旁路接入模式 2、不同设VLAN之间要进行通信&#xff0c;可以通过 .&#xff08;AB&#xff09; A.交换机 B.路由器 C.网闸 D.入侵检测 E.入侵防御系统…

美国国防部数据网格参考架构概述(上)

文章目录 前言一、概述二、DRMA基本概念三、DRMA的能力视图与运行视图前言 美国国防部正在努力成为“一个以数据为中心的组织,以速度和规模优势使用数据,从而获得作战优势并提高效率。”企业数据网格服务(又称数据集成层)是美国国防部首席数字与人工智能办公室(CDAO)为支…

error loading module ‘cjson‘ from file ‘.\cjson.dll‘:找不到指定的程序。

编译lua-cjson 项目&#xff1a;https://github.com/openresty/lua-cjson 克隆下来后使用vs2022创建工程 添加三个文件即可 fpconv.c lua_cjson.c strbuf.c 配置项目工程 lua头文件目录 链接器lua库文件目录 配置lua头文件 luaxxx/src 配置lua库文件 luaxxx.lib 编译d…

基于ssm+vue+Mysql的房屋租赁系统求租合同

开发语言&#xff1a;Java框架&#xff1a;ssmJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.…

交通运输智慧监管平台---强化物流安全与效率的新举措

一、建设背景 随着社会对于交通安全和环境保护的要求不断提高&#xff0c;对卡车运输的监管和合规性要求也逐渐加强。为了满足快速发展的物流需求&#xff0c;提高供应链协同和可追溯性、解决安全问题、提高运输效率和降低成本&#xff0c;我们利用现代技术和信息化手段着力建设…

ctfshow——SQL注入

文章目录 SQL注入基本流程普通SQL注入布尔盲注时间盲注报错注入——extractvalue()报错注入——updataxml()Sqlmap的用法 web 171——正常联合查询web 172——查看源代码、联合查询web 173——查看源代码、联合查询web 174——布尔盲注web 176web 177——过滤空格web 178——过…

nginx下载安装配置(含ssl)

下载安装环节 wget https://nginx.org/download/nginx-1.24.0.tar.gz tar -zxvf xxx.tar.gz yum -y install pcre-devel openssl openssl-devel ./configure --prefix/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream make & make i…

HTTP协议 --中

http状态码 当浏览者访问一个网页时&#xff0c;浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前&#xff0c;此网页所在的服务器会返回一个包含HTTP 状态码的信息头&#xff08; server header &#xff09;用以响应浏览器的请求。 HTTP 状态码的英文为…

【面试经典 150 | 数组】接雨水

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;预处理方法二&#xff1a;单调栈方法三&#xff1a;双指针 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff…

AI大模型日报#0430:疑似GPT4.5模型刷屏、上交实现「蛋白质功能定向进化」、微软紧急撤回WizardLM-2

导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了今日要点以及每条资讯的摘要。 《AI大模型日报》今日要点&#xff1a; 在AI大模型领域&#xff0c;多项研究进展和行业应用动态引发关注。一夜之间&#x…

一文掌握python杖举类(Enum)

目录 枚举类是一种特殊的数据类型,用于定义一组命名的常量集合,这些常量通常代表某一特定领域的有限且固定的选项集。通过使用枚举类,可以提高代码的可读性和可维护性,同时避免硬编码和潜在的类型错误。 一. 定义枚举类 二. 枚举成员 1、 名称与值 2、 访问枚举成员 …

Opencv_14_多边形填充与绘制

绘制多边形&#xff1a; 1&#xff09;coInvert.polyline_drawing(src); 2&#xff09;void ColorInvert::polyline_drawing(Mat& image) { Mat canvas Mat::zeros(Size(512, 512), CV_8UC3); Point p1(100, 100); Point p2(150, 100); Point p3(200…

CSS 文字超出显示滚动条

1、布局结构 <view class"tes" style"margin-top: 15rpx;"><p v-html"conten" class"conten"></p> </view> conten 里是内容 2、页面样式 .tes::-webkit-scrollbar-track-piece {background-color: rgba(…

vue3 安装-使用之第一篇

首先需要node版本高于V16.14.1 安装 执行 npm create vitelatest 具体选择按照自己实际需要的来 Project name:项目名称 Select a framework:选择用哪种框架 &#xff08;我选择vue&#xff09; Select a variant: 选择用JS还是TS&#xff08;我选择JS&#xff09;找到项目&…

kotlinDSL控制的安卓项目导入已存在的模块后sync报错

原因很明显&#xff0c;但是我还找了好久 因为在import时并没有选择groove还是kotlin控制&#xff0c; 所以默认为groovy控制的&#xff0c;然而主项目是由kotlin dsl控制的grale行为。 原因清楚之后&#xff0c;就可以去检查一下&#xff0c;项目里是否包含了settings.gradle和…

rk3588部署yolov8视频目标检测教程

1. 环境配置 1.1 训练和导出onnx环境 #使用conda创建一个python环境 conda create -n torch python3.9#激活环境 conda activate torch#安装yolov8 pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple 1.2 导出rknn环境 安装toolkit2-1.5.2 下载链接&am…

Ubuntu20.04安装MySQL数据库

1、说明 1.1、MySQL介绍 MySQL是一个开源数据库管理系统&#xff0c;通常作为流行的LAMP&#xff08;Linux&#xff0c;Apache&#xff0c;MySQL&#xff0c;PHP / Python / Perl&#xff09;堆栈的一部分安装。它使用关系数据库和SQL&#xff08;结构化查询语言&#xff09;来…