跳了一次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。。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,271评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,725评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,252评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,634评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,549评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,985评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,471评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,128评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,257评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,233评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,235评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,940评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,528评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,623评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,858评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,245评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,790评论 2 339

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,559评论 18 139
  • 文章作者:Tyan博客:noahsnail.com 1. 什么是泛型 Java泛型(Generics)是JDK 5...
    SnailTyan阅读 769评论 0 3
  • 前面,由于对泛型擦除的思考,引出了对Java-Type体系的学习。本篇,就让我们继续对“泛型”进行研究: JDK1...
    贾博岩阅读 5,127评论 3 28
  • 泛型是Java 1.5引入的新特性。泛型的本质是参数化类型,这种参数类型可以用在类、变量、接口和方法的创建中,分别...
    何时不晚阅读 3,022评论 0 2
  • 如果 你不快乐, 那就出去走走。 世界这么大, 风景很美,机会很多, 人生很短,不要蜷缩在一处阴影中。
    我有念念不忘的远方阅读 107评论 0 1