08 字符串连接符 “+“ 导致的 check cast 的省略

news/2024/5/5 0:42:23/文章来源:https://blog.csdn.net/u011039332/article/details/122821172

前言

// 年轻时候,到了冬天,家人让你穿秋裤,你不仅不穿秋裤,还露着脚脖子,如果有人劝你,你会嫌他唠叨。而等你岁数大一点,天气一冷,身体受不了,就自觉把秋裤穿上了。

呵呵 昨天的时候发现了这样的一个问题 泛型强转类型之后取数据的一个疑问,问题不好描述请看代码和截图吧。, 然后记录了一个 todo, 来看了一下

还是挺有意思的, 作者 本身也做了一定的思考

本以为 这个没有多少可以记录的内容, 没有想到 还是有一些细节的地方

以下内容基于 jdk8

测试用例

测试用例的主要内容来自于文章 泛型强转类型之后取数据的一个疑问,问题不好描述请看代码和截图吧。 | HeapDump性能社区

主要的问题在于 上面的 listTest.get 没有做 check cast, 下面的 listStr 做了 check cast 

按正常的逻辑来考虑, listTest.get 应该是也需要做 check cast 

/*** Test03GenericTypeCast** @author Jerry.X.He <970655147@qq.com>* @version 1.0* @date 2022-02-08 09:27*/
public class Test03GenericTypeCast {// Test03GenericTypeCastpublic static void main(String[] args) throws Exception {ArrayList<String> listStr = new ArrayList<String>();listStr.add("只能添加String类型");Class c2 = listStr.getClass();Method m = c2.getMethod("add", Object.class);m.invoke(listStr, 20);//注意listStr只能添加String类型,我们现在可以通过反射的手段绕过编译器给他加一个整形进去System.out.println("注意整形已经添加进去了,List的元素个数为:->       " + listStr.size());System.out.println();Object obj = listStr;ArrayList<Boolean> listTest = (ArrayList<Boolean>) obj;
//        ArrayList<Integer> listTest = (ArrayList<Integer>) obj;
//        ArrayList<StringBuffer> listTest = (ArrayList<StringBuffer>) obj;System.out.println("看看listTest的Class类型到底是什么类型:->    " + listTest.getClass());System.out.println("我想得到一个Boolean类型,但是得到确实String类型,这是为什么,为什么这里没报错?:->    " + listTest.get(0));System.out.println("我想得到一个Boolean类型,但是得到确实String类型,这是为什么,为什么这里没报错?:->    " + listTest.get(1));System.out.println("上面没报错就很奇怪,一定要搞明白");System.out.println();System.out.println("下面的会报错我能理解,上面的没报错我就不能理解?");System.out.println("listStr的toString方法,注意整形也可以输出出来:    " + listStr.toString());System.out.println("看看listStr的Class类型到底是什么类型:->    " + listStr.getClass());//Integer in = list2.get(1);编译直接就报错了System.out.println(listStr.get(1));//这里会什么又会报错了,因为lis2认为20是String类型的,结果就报错了,java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String}}

javac 层面的分析

最直接的来看一下 javac 到底做了什么 ?, 这是第一个层次 

先看一下 "listTest.get(0)" 这里面 pt 表示的是表达式期望的类型, mt.returnType 是表达式泛型擦除之后的类型, 这里两个类型是兼容的, 因此 

因此没有生成这个 check cast 

再来一下 "listStr.get(0)", 期望的类型是 String, 然后 泛型类型擦除之后的类型是 Object, 不兼容于 String, 因此 增加了一个 check cast 

 类型不兼容, javac 增加了一个 check cast 

listTest.get(0) 和 listStr.get(0) 的类型来自于哪里?

这个问题是 本问题的关键 

listTest.get(0) 的类型来自于这里的 + operator 的第二个参数, 类型是 Object 

然后这个约束是来自于 字符串连接符 "+"  

具体代码层面的 resolve 是在这里 

具体的 字符串连接符 "+" 的一些类型约束 

我们这里表达式 "我想得到一个Boolean类型,但是得到确实String类型,这是为什么,为什么这里没报错?:->    " + listTest.get(0) 

左边的操作数是一个 string, 右边的操作数匹配不上 原始类型 或者 String, 因此匹配的是 String + Object 

listStr.get(0) 的类型, 取决于 System.out.println, 选择的是 类型 String 

jls 中的 String Concatenation Operator +

 

参考

泛型强转类型之后取数据的一个疑问,问题不好描述请看代码和截图吧。 | HeapDump性能社区

03 为Map.put的增加的checkcast & 增加了一段业务无关的 instance.getClass() 的调用_970655147的专栏-CSDN博客

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

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

相关文章

图论二分图问题讲解-染色法和匈牙利算法

二分图 概述&#xff1a; 二分图又称作二部图&#xff0c;是图论中的一种特殊模型。 设G(V,E)是一个无向图&#xff0c;如果顶点V可分割为两个互不相交的子集(A,B)&#xff0c;并且图中的每条边&#xff08;i&#xff0c;j&#xff09;所关联的两个顶点i和j分别属于这两个不同的…

使用Python将微信和支付宝账单导入随手记

简介 本文介绍如何使用Python将微信和支付宝账单转换为可以导入随手记的文件&#xff0c;实现微信和支付宝账单的批量导入。 需求&#xff1a; 1、需要将支付宝和微信上的支出账单自动或半自动地导入到随手记中 已知信息&#xff1a; 1、支付宝和微信的app端都可以导出csv…

引导过程与服务控制

目录: 1、引导过程总览 2、备份与恢复第一块硬盘前512字节 3、修复GRUB引导故障 4、忘记密码 5、开关系统服务控制Linux操作系统引导过程引导过程总览: 开机自检→MBR引导→GRUB菜单→加载内核→init进程初始化 1、bios 检查硬件设置grub功能和组成 bootloader:引导加载器,…

npm install ,npm ERR code 401 Incorrect or missing password 错误原因与.npmrc 配置文件的使用

前言&#xff1a;前端去维护项目时&#xff0c;通过 git clone 下来以后&#xff0c;经常是直接 npm install 去安装项目需要的 node_modules &#xff0c;但是往往很多项目不是我们自己写的&#xff0c;或者从 GitHub 上面 clone 的开源项目&#xff0c;这个时候出现问题就很难…

【ASM】字节码操作 转换已有的类 ClassReader 删除方法 添加方法

文章目录 1.概述2.案例2.1 删除方法2.2 添加方法2.3小总结3.总结1.概述 上一篇文章:【ASM】字节码操作 转换已有的类 ClassReader 修改字段信息 删除字段 增加字段 在上一篇文章中我们学到了如何添加字段与删除字段。 本章节我们来尝试修改方法和删除方法。 2.案例 2.1 删…

搜索查找类

查找搜索类\color{blue}{\huge{查找搜索类}}查找搜索类 find find指令从指定目录向下递归地便利各个子目录&#xff0c;如果在/root目录下进行寻找&#xff0c;根据文件目录的树状结构&#xff0c;就是进行全盘查找&#xff0c;非常浪费时间&#xff0c;所以使用find 进行寻找…

MATLAB | 绘图复刻(二) | 折线图+误差棒+柱状图+散点抖动+灰色背景+图片叠加

看到gzh R语言ggplot2科研绘图发布了一篇绘图复刻类文章&#xff0c;复刻了&#xff1a; Nature(IF49.962)文章(Gut microbiota modulates weight gain in mice after discontinued smoke exposure)其中的Figure.1b&#xff0c;绘制效果十分惊艳&#xff0c;手痒就想拿MATLAB也…

RocketMQ 消费者Rebalance算法 解析——图解、源码级解析

&#x1f34a; Java学习&#xff1a;Java从入门到精通总结 &#x1f34a; 深入浅出RocketMQ设计思想&#xff1a;深入浅出RocketMQ设计思想 &#x1f34a; 绝对不一样的职场干货&#xff1a;大厂最佳实践经验指南 &#x1f4c6; 最近更新&#xff1a;2022年10月15日 &#…

(附源码)计算机毕业设计大学生网上书店

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

(附源码)计算机毕业设计电脑外设销售系统小程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

操作系统基本功能(操作系统)

目录 一、处理机管理 二、存储器管理 三、设备管理 四、文件管理 五、作业管理 一、处理机管理 中央处理机&#xff08;CPU&#xff09;是计算机系统中一个举足轻重的资源。用户程序进入内存后&#xff0c;只有获得CPU&#xff0c;才能真正得以运行。 为了提高CPU的利用率…

前端都应该了解的 NodeJs 知识及原理浅析

node.js 初探 Node.js 是一个 JS 的服务端运行环境&#xff0c;简单的来说&#xff0c;它是在 JS 语言规范的基础上&#xff0c;封装了一些服务端的运行时对象&#xff0c;让我们能够简单实现非常多的业务功能。 如果我们只使用 JS 的话&#xff0c;实际上只是能进行一些简单…

docker mysql8使用SSL及使用openssl生成自定义证书

《docker安装MySQL8》 修改my.cnf vi /docker_data/mysql/conf/my.cnf[client] default-character-setutf8mb4 [mysql] default-character-setutf8mb4 [mysqld] character-set-serverutf8mb4 default_authentication_pluginmysql_native_password #增加ssl ssl保存&#xff0…

【让你从0到1学会c语言】文件操作

作者&#xff1a;喜欢猫咪的的程序员 专栏&#xff1a;《C语言》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 什么是文件&#xff1a; 我们为什么要使用文件呢&#xff1f; 文件分类&#x…

rbf神经网络和bp神经网络,rbf神经网络百度百科

1、rbf神经网络算法是什么? RBF神经网络算法是由三层结构组成&#xff0c;输入层至隐层为非线性的空间变换&#xff0c;一般选用径向基函数的高斯函数进行运算&#xff1b;从隐层至输出层为线性空间变换&#xff0c;即矩阵与矩阵之间的变换。 RBF神经网络进行数据运算时需要…

基于springboot的旅游打卡攻略分享小程序

&#x1f496;&#x1f496;作者&#xff1a;IT跃迁谷毕设展 &#x1f499;&#x1f499;个人简介&#xff1a;曾长期从事计算机专业培训教学&#xff0c;本人也热爱上课教学&#xff0c;语言擅长Java、微信小程序、Python、Golang、安卓Android等。平常会做一些项目定制化开发…

预处理的补充知识

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;《初识C语言》 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录一、宏的补充知识1.1 宏定义充当注释…

MABSA(Multimodal Aspect-Based Sentiment Analysis)2022ACL 预训练

大致浏览&#xff0c;没有细看。 论文题目&#xff08;Title&#xff09;&#xff1a; Vision-Language Pre-Training for Multimodal Aspect-Based Sentiment Analysis 研究问题&#xff08;Question&#xff09;&#xff1a;多模态情感分析 MABSA (Multimodal Aspectased S…

黑马程序员Java零基础视频教程(2022最新Java)B站视频学习笔记-Day14-面向对象进阶02

1、权限修饰符和代码块 1.1 权限修饰符 权限修饰符&#xff1a;是用来控制一个成员能够被访问的范围的。 可以修饰&#xff1a;成员变量、方法、构造方法、内部类。 巧计举例&#xff1a; private--------私有的----------相当于私房钱&#xff0c;只能自己用 默认--------…

LVS+KeepAlived高可用负载均衡集群

内容预知 1. 高可用群集的相关知识 1. 1 高可用&#xff08;HA&#xff09;群集与普通群集的比较 普通群集 高可用群集(HA) 1.2 KeepAlive 高可用方案 1.3 KeepAlived的体系模块 1.4 Keepalived实现原理 2. 高可用群集的脑裂现象及预防措施 2.1 高可用集群的脑裂现象及其…