java同事不写泛型_跳了一次JAVA泛型擦除的坑

记录一下今天在帮同事解决使用spring参数注入问题的时候由于对泛型的理解不到位而遇到的坑。

如下代码所示:

@RequestMapping(value="saveAll")

public ResponseMsg saveAll(List rules){

Rule rule=rules.get(0); //这行代码在测试的时候报错了

......

}

这段代码的意思是使用spring的参数注入功能自动完成将前端传过来的数据装载到rules变量里面。

我刚开始一直认为这段代码肯定是对的,然后就一直说同事一定是前端传过来的数据有错,然后就各种检查js,debug一步一步的查,发现前端传过来的数据是正确的,后来我又想会不会是eclipse的debug功能有缺陷(原谅一个idea粉对eclipse的各种不屑),当然继续被打脸,因为我在我电脑上debug时数据是一样的,rules里面的元素居然是LinkedHashMap!!看着debug显示的数据,简直不能接受,我明明声明了rules对象只能存Rules对象啊,怎么会装其他对象!!

然后就真的没辙了。。我就说这个问题我解决不了了,超出我认知范围啊,然后我们叫了一个正式员工过来帮我们看看。。他开始也是按我们的步骤排错,后来遇到和我们一样的问题,但是牛人终究是牛人,能想出来的导致问题的因素也比我们多,他说会不会是spring不支持这种带泛型的自动参数装载啊,毕竟泛型是要被擦除的。。

擦除。。。泛型擦除。。。我靠,我终于知道是什么原因了。之前看了那么多关于泛型擦除的居然都没有想到是这个问题!!而且这种坑当时也踩过,居然没联想起来,智商捉急。

关于泛型擦除的详细介绍具体是什么我就不写在这篇文章里面了,大概就是在编译前会执行一系列的语法检查,从而减少因为强制类型转换带来的异常,但是编译后的代码是不含泛型的,会将泛型限制的元素类型给去掉。

也就是说虽然我声明了rules只能装Rule类型的对象,但是代码被编译后,这个限制就没有了!因为通过语法检查rules里的元素确实是Rule类型的对象,所以并不需要在编译后再去检查。但是问题来了,这种检查只能检查一些显式生命的对象是不是Rule类型,而java是可以通过反射来动态的生成对象的,sprng在参数注入的时候是通过反射实现前端参数自动装载入对象的相关属性!!

所以这样声明的问题在于,由于编译时对rules内元素类型的限制已经被擦除了,所以spring并不知道反射成那种类型的对象,于是就默认的用LinkedHashMap来装载一个对象所有的属性和值,于是rules里面的对象在运行的时候实际上是LinkedHashMap!!!所以spring可能并不支持泛型参数或者需要指定其他条件才能正确的注入泛型参数(这个还没有深究)。

至于以前踩过这方面的坑就是用Gson反序列化带泛型的对象的时候需要额外指定一个参数来说明集合里面的元素类型(具体的我忘了,这个有思路就好)。当时也是觉得很奇妙,为什么不做得智能一点自己识别,我不是已经通过泛型指定类型了么。当时也就抱怨一下,没有怎么多想,现在想起来还真是too young , too simple。。

这件事让我明白不要盲目的相信自己的经验,计算机肯定是对的。经验解决不了的问题,就从原理一步一步去想,平时学的理论可能看起来没什么用,就好像科普一样,然而在解决一些问题时确是一针见血。多联想,发散思维才能在技术这条路上走得更远。

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

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

相关文章

程序员职场:拥有一个学位将会在你的职业生涯中更加顺利!

1、作为程序员为什么要拥有学位?很多情况下,作为程序员,学位是进入大公司的敲门砖。现在很多大的科技公司,学位是硬性要求。一般都是本科以上的学历,甚至有的必须是硕士以上学历。如果你的学历达不到,基本上…

集合和数组的区别

集合和数组的区别 数组是固定长度的;集合可变长度的。 数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型。 数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。

程序员常见的职业病有哪些?

程序员是一个久坐的行业,基本上一天有十几个小时需要坐在电脑旁边,随之而来会给我们这些广大的程序员朋友们身体健康带来了很大的隐患。作为一名优秀的程序员,爱护自己的身体也是非常重要的,毕竟身体是革命的本钱嘛。今天主要给大…

java文件流null_JAVA 获取资源文件对象为NULL

今天,写一个添加背景音乐的方法时,在导入当前文件夹下的音乐时中始终出现,以下的异常,Exception in thread "main" java.lang.NullPointerException文件存储位置存放在当前的modlue目录下,格式为wav.源代码private void playBGM(){…

iOS数据持久化

TODO:数据持久化 CoreData FMDB Sqlite3 归档解档 plist NSUserDefault转载于:https://www.cnblogs.com/newhope/p/5382034.html

程序员如何快速消除自己的知识短板?

在程序员的职业生涯当中,知识短板将会是你职业生涯发展的瓶颈。只要你能够消除这些短板,这对你的职业发展会大有裨益。本篇文章主要给大家分享一下如何解决自己工作当中的知识短板。希望对大家能有些帮助。1、关于知识短板的概念理解我个人认为所谓的知识…

HashMap默认大小和扩容后的大小

put添加的元素Entry就是数组中的元素,每个Map.Entry其实就是一个key-value对,它持有一个指向下一个元素的引用,这就构成了链表。 创建HashMap对象默认情况下,数组大小为16。 开始扩容的大小原来的数组大小*loadFactor。 扩容后…

swift函数

1、函数定义格式:func 函数名(形参列表) ->返回值类型{//函数体}形参列表的格式:形参名1:形参类型,形参名2:形参类型,....如:func max(nun:Int, num:Int) ->Int{return 0;}2、无返回值的…

java 解密后为空_java RSA加密解密

该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1.jar注意:RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以在加密和解密的过程中需要分块进行。RSA加密对明文的长度是有限制的&#xff0…

程序员效率:职业倦怠的理解

作为程序员保持高效的工作效率最大的挑战之一就是身体和心理上产生的倦怠。这个是非常常见的,比如刚开始你自己做一个新项目的时候,项目刚开始,我们总是充满激情、精力旺盛。大多数情况随着时间的推移,我们的激情慢慢减退&#xf…

OnItemClickListener,OnScrollListener应用

OnItemClickListener:处理视图中单个条目的点击事件 OnScrollListener:监听滚动的变化,可以用于视图在滚动中加载数据 OnItemClickListener:实现AdapterView.OnItemClickListener接口,别忘记在MainActivity中调用listView.setOnIt…

Mysql 多实例multi_mysqld_multi多实例运行

mysqld_multi多实例运行2016-05-04 TsengYia126.com http://tsengyia.blog.chinaunix.net#################################################################系统环境:RHEL 6.7 [2.6.32-573.el6.x86_64]软件环境:mysql-server-5.1.73-5.el6_6.x86_64m…

HashMap和ArrayList初始大小和扩容后的大小

创建HashMap对象默认情况下,数组大小为16。 开始扩容的大小原来的数组大小*loadFactor。 扩容后大小是原来的2倍,其中加载因子loadFactor的默认值为0.75,这个参数可以再创建对象时在构造方法中指定。 例如: 16*0.7512&#xf…

程序员效率:如何合理的分解任务

有这样一句名言:要吃掉一头大象,每次吃一口。—— 克雷顿艾布拉姆斯(Creighton Abrams)这句名言给我们的启示就是:看起来非常艰巨的任务,不能一蹴而就,需要进行任务分解,一步一步把它…

linux安装nagios客户端

( 安装到 被监控的机器上)新增用户和组 useradd nagiosgroupadd nagcmd usermod -a -G nagcmd nagios (如果安装中报没有c编译器,就 yum install gcc) 下载nagios插件 wget http://sourceforge.net/projects/nagiosplug/files/nagiosplug/1.4.15/nagios-plugins-1.4…

键值的 key 和 value 允许为null吗

总结: HashMap对象的key、value值均可为null。HahTable对象的key、value值均不可为null。两者的的key值均不能重复,若添加key相同的键值对,后面的value会自动覆盖前面的value,但不会报错。 例子 可以看到添加key相同的键值对&am…

程序员:你的业余时间是怎么被浪费掉的?

作为一名程序员如何有效的管理自己的业余时间,会成为和别人拉开差距的重要因素。当然你不能把每天的每一分钟都充分利用起来。这个目标不可能实现。我们可以做到的是找到自己在哪一方面浪费的时间最多,然后逐渐的去消除它。如果你可以消除掉一到两个方面…

java的rserve实现_Java 使用 Rserve 实现与 R 的通信

Rserve 是一个基于 TCP/IP 的服务器程序,它允许其他语言调用 R 语言。由于 Rserve 采用 C/S (客户端/服务器)的调用方式,因此客户端并不需要链接 R 语言库,客户端程序与 R 程序可以实现低耦合的目的。为调用 R 语言,需要实现一个与…

对其他组所提建议的回复(第一阶段)

序号题目组名 1理财猫非常3加11.图片的浏览功能我们会在第二阶段完成2跑什么操running man1.我们会尽快将界面和功能整合 2.物品的分类会在后期进行中逐步完善3水骑士水骑士团队暂无4铁大云盘老司机1.我们的项目是可以显示“注册成功”的,你的建议... 2.买家卖家的聊…

数据库文档生成工具V1.0

❤️作者主页:IT技术分享社区 ❤️作者简介:大家好,我是IT技术分享社区的博主,从事C#、Java开发九年,对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉: 数据库领域优质创作者🏆&#x…