動作
Bug #276
進行中
SC
修正 T2-06a core location 型別不一致編譯錯誤(CI 首跑抓出)
Bug #276:
修正 T2-06a core location 型別不一致編譯錯誤(CI 首跑抓出)
狀態:
New
優先權:
Normal
被分派者:
-
開始日期:
2026-06-09
完成日期:
完成比例:
0%
預估工時:
概述
修正 T2-06a core module location 型別不一致導致的編譯錯誤(CI 首跑抓出)¶
背景¶
T2-06a(Feature #270)交付的 android/core 53 個單元測試,因本機與 Windows host 皆無 JDK 從未實際編譯。本專案於 Feature #272 加入 GitHub Actions CI(JDK 17 + Gradle 8.7)後,CI 首跑即在編譯階段失敗——這正是當初導入 CI 的目的:在無本機 JDK 的情況下,由雲端環境抓出程式問題。
本票修正該編譯錯誤。
根因¶
location 欄位在三處對「未觀測」語意的型別認知不一致:
| 位置 | 原本 | 問題 |
|---|---|---|
TriageRecord.location(model) |
FieldState<Location>? |
設計原意:外層 null = 未觀測,內層必為實值 |
MergeStrategyRegistry init |
LWW_HLC<Location?>() |
註冊成內層可空,與 model 不符 |
TriageRecordMerger 合併段 |
FieldState<Location?>? |
跟著 registry 用內層可空,assemble 回 local.copy(location=…) 時型別對不上 |
Kotlin 編譯器報 5 處 Type mismatch: FieldState<Location> vs FieldState<Location?>(TriageRecordMerger.kt:125,126,127,167)。
本質:「未觀測」只該由外層 null(FieldState<Location>?)表達;內層再套一層 Location? 是多餘的雙重 null,registry 當初註冊錯誤。
變更內容¶
統一對齊到 FieldState<Location>?(內層非空):
-
MergeStrategyRegistry.kt:LWW_HLC<Location?>()→LWW_HLC<Location>() -
TriageRecordMerger.kt: -
registry.get<Location?>("location")→registry.get<Location>("location") -
mergedLocation: FieldState<Location?>?→FieldState<Location>? - both-non-null 分支改用
local.location!!, remote.location!!(該when分支前已排除兩者為 null,!!安全且避免依賴跨分支 smart-cast) - 更新註解,說明內層非空的設計理由
TestFixtures.kt的location: Location? = null為 builder 原始值參數(非 FieldState 包裝),透過location?.let { FieldState(it, …) }組出FieldState<Location>?,已與新型別一致,無需修改。
驗收標準¶
-
CI
android-core-tests通過:core:compileKotlin(不再有 Type mismatch) -
CI 進入並完成
:core:test,53 個測試首次真正執行 - 編譯過後測試仍可能有 assertion 失敗(此前從未跑過);若紅則依報告續修,屬正常 PoC 驗證流程
後續¶
- 測試報告 artifact 可於 Actions 頁下載檢視
- 全綠後 → T2-06a 正式驗收通過 → 進 T2-06b(Room 持久化層)
沒有任何資料可供顯示
動作