成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

代碼出錯了,IDE竟然不報錯?太詭異了....

開發 后端
今天分享一個寫代碼時遇到的詭異問題,如何排查解決的。但有些問題比較抽象,不知道如何來描述,怎么辦?或者勉強描述清楚了,搜出來的答案也很難滿足要求,整個過程猶如大海撈針。最后求助 ChatGPT 瞬間解決,給大家分享下解決思路。

小伙伴好哇,我是Tom哥。

今天分享一個寫代碼時遇到的詭異問題,如何排查解決的。

從事互聯網的人都懂,一般遇到問題時,首先會想用谷歌、百度等搜索引擎,看看前輩們是如何解決的。

但有些問題比較抽象,不知道如何來描述,怎么辦?或者勉強描述清楚了,搜出來的答案也很難滿足要求,整個過程猶如大海撈針。最后求助 ChatGPT 瞬間解決,給大家分享下解決思路。

問題的來龍去脈

正在開發一個項目,倉儲層有一個接口類(IProductReadRepository),其中一個方法的入參使用了 Java 泛型,具體如下:

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

在上層的領域服務中,有一處調用這個方法的代碼,具體如下:

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); 這行代碼非常詭異

返回的結果List<ProductSummaryVO>并不匹配,但在IDEA中卻沒有報錯,這讓我們感到非常困擾。

這是怎么回事?

當時懷疑是錯覺,仔細對比了兩個方法,確實是對的。

又懷疑是 IDEA 的緩存干擾導致,所以將工程重新 build 了一次還是不行!

接下來,能想到的各種招數都招呼上,比如:

  • 在終端執行 mvn clean install -U,重新編譯代碼,并強制 Maven 更新所有依賴的快照版本(Snapshot)
  • 手動將 maven 的本地倉庫的依賴包全部刪除,重新拉取
  • 將本地工程文件中的 target 文件刪除
  • .....

最后,使出絕招,將本地的工程代碼全部刪除,然后重新從 git 上拉取最新代碼,編譯,導入到 IDEA 工程。

但,但,但,問題依然存在,真讓人崩潰。

難道是 IDEA 中的錯誤檢查失效了,于是人為制造了一些錯誤,發現 IDEA 也都能識別出來。

實在沒招了。。。。。。。

最后,還是問下 ChatGPT 吧

首先,先把問題描述清楚,ChatGPT 特懂人情世故,你跟他講清楚問題,他也會給你一個清楚的答案。

有一個接口內的方法定義如下:

 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;
}

ChatGPT 很快就給出了答案。

問題可能出在泛型擦除和編譯時類型檢查上。由于Java泛型的擦除機制,在運行時無法獲取泛型的實際類型,這可能導致類型不匹配的問題。

那我們就按照它的思路來,將這行代碼  ProductQueryWrapper productQueryWrapper = ProductQueryWrapper.builder()

修改為  ProductQueryWrapper<List<Long>> productQueryWrapper = ProductQueryWrapper.<List<Long>>builder()

在構建 ProductQueryWrapper 對象時, 指定泛型參數的具體類型,以便在運行時能夠正確地識別參數類型。

然后,問題真的解決了。

如下圖所示,第二處紅框位置的代碼開始報錯。因為接口的規范(返回結果)調整了,此處確實應該報錯提示。

后面,我們根據錯誤提示,將 ProductSummaryVO 類替換成 SpuVO 類。

最終,不但編譯不報錯,單元測試也能跑通。問題完美解決。

背后的原因

為何在 IDEA 中沒有直接報錯呢?這里牽扯到Java泛型的類型推斷機制。

上述代碼中,雖然使用了原始類型 ProductQueryWrapper ,但沒有指定具體的泛型類型。

Java 7 及以后的版本引入了菱形操作符(Diamond Operator),允許在創建對象時不再重復指定泛型類型,而是通過上下文進行類型推斷。

這就意味著在你的代碼中,雖然沒有明確指定泛型類型,但由于在 ProductQueryWrapper.builder() 上下文中,編譯器會嘗試根據調用方的期望類型來推斷泛型參數。

這種類型推斷機制使得在 IDEA 開發工具不會直接報錯,也就出現了上文說到的那個問題。

今天的分享就到這里,我們下回再見。

責任編輯:姜華 來源: 微觀技術
相關推薦

2022-08-31 10:40:40

MySQL數據庫

2024-12-02 08:01:47

加鎖高并發程序

2019-10-28 08:44:29

Code Review代碼團隊

2019-09-19 11:20:51

PythonPyCharm腳本語言

2012-05-18 13:23:02

iPhone 4S

2020-10-16 09:09:56

代碼業務模型

2014-07-03 14:04:55

Bug報告Bug

2021-09-01 18:38:59

Goselectdefault

2024-04-15 00:00:00

Git管理代碼

2015-12-07 14:11:01

2021-12-02 09:31:22

Python 代碼進度條

2024-12-11 09:25:59

2024-04-30 08:05:15

Rust代碼計算

2025-03-03 08:49:59

2023-09-02 11:21:54

代碼ChatGPT

2011-05-16 10:16:19

MYSQL出錯代碼

2021-01-19 05:27:44

HTTPSECDHE算法

2021-09-09 19:19:50

命令Rm 腳本

2021-09-18 06:31:11

rmLinux文件

2021-08-02 19:18:32

Redis緩存高并發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区av在线 | 自拍偷拍亚洲视频 | 亚洲一区欧美一区 | 中文字幕在线一区二区三区 | 午夜精品久久久久久久久久久久 | 日本三级电影在线观看视频 | 在线看av的网址 | 免费黄色的网站 | 精品视频在线一区 | 亚洲欧美在线视频 | 精品国产一区二区三区日日嗨 | 欧美精品在欧美一区二区 | 国产精品一区二区三区四区 | 激情网站在线观看 | 女同久久 | 国产乱精品一区二区三区 | 最新日韩在线视频 | 中文精品一区二区 | 热久久性| 国产91精品在线 | 亚洲天天干 | 高清欧美性猛交xxxx黑人猛交 | 国产片淫级awww | 91精品国产91| 在线视频日韩 | 91成人在线视频 | 天堂一区二区三区 | 在线中文视频 | 91精品国产91久久久久久三级 | 日韩一区二区久久 | 亚洲一区 中文字幕 | 日韩一区二区三区精品 | 99热都是精品 | 亚洲成av人片在线观看 | 亚洲国产精品久久人人爱 | 91在线精品视频 | 中文字幕 亚洲一区 | 亚洲国产精品日韩av不卡在线 | 日韩毛片 | 国产高清一区二区三区 | 日本亚洲一区 |