当前位置:首页 > 科技  > 软件

代码出错了,IDE竟然不报错?太诡异了....

来源: 责编: 时间:2024-01-04 09:33:20 433观看
导读小伙伴好哇,我是Tom哥。今天分享一个写代码时遇到的诡异问题,如何排查解决的。从事互联网的人都懂,一般遇到问题时,首先会想用谷歌、百度等搜索引擎,看看前辈们是如何解决的。但有些问题比较抽象,不知道如何来描述,怎么办?或

sNg28资讯网——每日最新资讯28at.com

小伙伴好哇,我是Tom哥。sNg28资讯网——每日最新资讯28at.com

今天分享一个写代码时遇到的诡异问题,如何排查解决的。sNg28资讯网——每日最新资讯28at.com

从事互联网的人都懂,一般遇到问题时,首先会想用谷歌、百度等搜索引擎,看看前辈们是如何解决的。sNg28资讯网——每日最新资讯28at.com

但有些问题比较抽象,不知道如何来描述,怎么办?或者勉强描述清楚了,搜出来的答案也很难满足要求,整个过程犹如大海捞针。最后求助 ChatGPT 瞬间解决,给大家分享下解决思路。sNg28资讯网——每日最新资讯28at.com

问题的来龙去脉

正在开发一个项目,仓储层有一个接口类(IProductReadRepository),其中一个方法的入参使用了 Java 泛型,具体如下:sNg28资讯网——每日最新资讯28at.com

List<SpuVO> batchQuerySpuBySpuIdsFromDB(ProductQueryWrapper<List<Long>> req);

在上层的领域服务中,有一处调用这个方法的代码,具体如下:sNg28资讯网——每日最新资讯28at.com

ProductQueryWrapper productQueryWrapper = ProductQueryWrapper.builder()        .bizCode(BusinessCodeEnum.SMART.getCode())        .bizScene(BusinessSceneEnum.RETAIL.getCode())        .storeId(multiPackageVO.getStoreId())        .bizParams(spuIds)        .build();List<ProductSummaryVO> productSummaryVOS = productReadRepository.batchQuerySpuBySpuIdsFromDB(productQueryWrapper);if (CollectionUtils.isEmpty(productSummaryVOS)) {    bizResult.error(BizErrorCode.MULTI_PACKAGE_PRODUCT_NOT_EXIST);    return bizResult;}

其中,List<ProductSummaryVO> productSummaryVOS = productReadRepository.batchQuerySpuBySpuIdsFromDB(productQueryWrapper); 这行代码非常诡异sNg28资讯网——每日最新资讯28at.com

返回的结果List<ProductSummaryVO>并不匹配,但在IDEA中却没有报错,这让我们感到非常困扰。sNg28资讯网——每日最新资讯28at.com

这是怎么回事?sNg28资讯网——每日最新资讯28at.com

当时怀疑是错觉,仔细对比了两个方法,确实是对的。sNg28资讯网——每日最新资讯28at.com

又怀疑是 IDEA 的缓存干扰导致,所以将工程重新 build 了一次还是不行!sNg28资讯网——每日最新资讯28at.com

接下来,能想到的各种招数都招呼上,比如:sNg28资讯网——每日最新资讯28at.com

  • 在终端执行 mvn clean install -U,重新编译代码,并强制 Maven 更新所有依赖的快照版本(Snapshot)
  • 手动将 maven 的本地仓库的依赖包全部删除,重新拉取
  • 将本地工程文件中的 target 文件删除
  • .....

最后,使出绝招,将本地的工程代码全部删除,然后重新从 git 上拉取最新代码,编译,导入到 IDEA 工程。sNg28资讯网——每日最新资讯28at.com

但,但,但,问题依然存在,真让人崩溃。sNg28资讯网——每日最新资讯28at.com

难道是 IDEA 中的错误检查失效了,于是人为制造了一些错误,发现 IDEA 也都能识别出来。sNg28资讯网——每日最新资讯28at.com

实在没招了。。。。。。。sNg28资讯网——每日最新资讯28at.com

最后,还是问下 ChatGPT 吧sNg28资讯网——每日最新资讯28at.com

首先,先把问题描述清楚,ChatGPT 特懂人情世故,你跟他讲清楚问题,他也会给你一个清楚的答案。sNg28资讯网——每日最新资讯28at.com

有一个接口内的方法定义如下: List<SpuVO> batchQuerySpuBySpuIdsFromDB(ProductQueryWrapper<List<Long>> req);使用下面的代码来调用 batchQuerySpuBySpuIdsFromDB,返回的 List<SpuVO> 结果并不匹配,但在 IDEA 中没有报错,是什么原因?ProductQueryWrapper productQueryWrapper = ProductQueryWrapper.builder()        .bizCode(BusinessCodeEnum.SMART.getCode())        .bizScene(BusinessSceneEnum.RETAIL.getCode())        .storeId(multiPackageVO.getStoreId())        .bizParams(spuIds)        .build();List<ProductSummaryVO> productSummaryVOS = productReadRepository.batchQuerySpuBySpuIdsFromDB(productQueryWrapper);if (CollectionUtils.isEmpty(productSummaryVOS)) {    bizResult.error(BizErrorCode.MULTI_PACKAGE_PRODUCT_NOT_EXIST);    return bizResult;}

sNg28资讯网——每日最新资讯28at.com

ChatGPT 很快就给出了答案。sNg28资讯网——每日最新资讯28at.com

问题可能出在泛型擦除和编译时类型检查上。由于Java泛型的擦除机制,在运行时无法获取泛型的实际类型,这可能导致类型不匹配的问题。sNg28资讯网——每日最新资讯28at.com

sNg28资讯网——每日最新资讯28at.com

那我们就按照它的思路来,将这行代码  ProductQueryWrapper productQueryWrapper = ProductQueryWrapper.builder()sNg28资讯网——每日最新资讯28at.com

修改为  ProductQueryWrapper<List<Long>> productQueryWrapper = ProductQueryWrapper.<List<Long>>builder()sNg28资讯网——每日最新资讯28at.com

在构建 ProductQueryWrapper 对象时, 指定泛型参数的具体类型,以便在运行时能够正确地识别参数类型。sNg28资讯网——每日最新资讯28at.com

然后,问题真的解决了。sNg28资讯网——每日最新资讯28at.com

如下图所示,第二处红框位置的代码开始报错。因为接口的规范(返回结果)调整了,此处确实应该报错提示。sNg28资讯网——每日最新资讯28at.com

sNg28资讯网——每日最新资讯28at.com

后面,我们根据错误提示,将 ProductSummaryVO 类替换成 SpuVO 类。sNg28资讯网——每日最新资讯28at.com

最终,不但编译不报错,单元测试也能跑通。问题完美解决。sNg28资讯网——每日最新资讯28at.com

sNg28资讯网——每日最新资讯28at.com

背后的原因

为何在 IDEA 中没有直接报错呢?这里牵扯到Java泛型的类型推断机制。sNg28资讯网——每日最新资讯28at.com

上述代码中,虽然使用了原始类型 ProductQueryWrapper ,但没有指定具体的泛型类型。sNg28资讯网——每日最新资讯28at.com

Java 7 及以后的版本引入了菱形操作符(Diamond Operator),允许在创建对象时不再重复指定泛型类型,而是通过上下文进行类型推断。sNg28资讯网——每日最新资讯28at.com

这就意味着在你的代码中,虽然没有明确指定泛型类型,但由于在 ProductQueryWrapper.builder() 上下文中,编译器会尝试根据调用方的期望类型来推断泛型参数。sNg28资讯网——每日最新资讯28at.com

这种类型推断机制使得在 IDEA 开发工具不会直接报错,也就出现了上文说到的那个问题。sNg28资讯网——每日最新资讯28at.com

今天的分享就到这里,我们下回再见。sNg28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-57393-0.html代码出错了,IDE竟然不报错?太诡异了....

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Spring国际化的应用及原理详解

下一篇: Elasticsearch 8.X 小技巧:使用存储脚本优化数据索引与转换过程

标签:
  • 热门焦点
  • 一文看懂为苹果Vision Pro开发应用程序

    译者 | 布加迪审校 | 重楼苹果的Vision Pro是一款混合现实(MR)头戴设备。Vision Pro结合了虚拟现实(VR)和增强现实(AR)的沉浸感。其高分辨率显示屏、先进的传感器和强大的处理能力
  • WebRTC.Net库开发进阶,教你实现屏幕共享和多路复用!

    WebRTC.Net库:让你的应用更亲民友好,实现视频通话无痛接入! 除了基本用法外,还有一些进阶用法可以更好地利用该库。自定义 STUN/TURN 服务器配置WebRTC.Net 默认使用 Google 的
  • 梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大&ldquo;烤&rdquo;之下的除了众生,还有各大企业发布的ESG报告。ESG是&ldquo;环境保
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的&ldquo;征求意见版&rdquo;:1、取消P序列
  • 8月见!小米MIX Fold 3获得3C认证:支持67W快充

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都得到了不少爆料,而小米新一代折叠屏旗舰——小米MIX Fold 3此前也屡屡被传
  • 超级标准版旗舰!iQOO 11S全球首发iQOO超算独显芯片

    上半年已接近尾声,截至目前各大品牌旗下的顶级旗舰都已悉数亮相,而下半年即将推出的顶级旗舰已经成为了数码圈爆料的主流,其中就包括全新的iQOO 11S系
  • Android 14发布:首批适配机型公布

    5月11日消息,谷歌在今天凌晨举行了I/O大会,本次发布会谷歌带来了自家的AI语言模型PaLM 2、谷歌Pixel Fold折叠屏、谷歌Pixel 7a手机,同时发布了Androi
  • OPPO K11采用全方位护眼屏:三大护眼能力减轻视觉疲劳

    日前OPPO官方宣布,全新的OPPO K11将于7月25日正式发布,将主打旗舰影像,和同档位竞品相比,其最大的卖点就是将配备索尼IMX890主摄,堪称是2000档位影像表
Top