跳至主要内容

Kotlin 1.7.20 的相容性指南

保持語言現代化舒適的更新 是 Kotlin 語言設計的基本原則。 前者表示應移除阻礙語言發展的結構,而後者表示應事先充分溝通此移除,以使程式碼遷移盡可能順暢。

通常不相容的變更只會在功能版本中發生,但這次我們必須在增量版本中引入兩個此類變更,以限制 Kotlin 1.7 中變更所引入問題的蔓延。

本文檔總結了這些變更,並為從 Kotlin 1.7.0 和 1.7.10 遷移到 Kotlin 1.7.20 提供了參考。

基本術語

在本文檔中,我們介紹了幾種相容性:

  • 原始碼 (source):原始碼不相容的變更會阻止原本可以正常編譯(沒有錯誤或警告)的程式碼再也無法編譯
  • 二進位 (binary):如果交換兩個二進位成品不會導致載入或連結錯誤,則稱這兩個二進位成品是二進位相容的
  • 行為 (behavioral):如果同一程式在套用變更前後表現出不同的行為,則稱該變更在行為上不相容

請記住,這些定義僅適用於純 Kotlin。 從其他語言的角度來看,Kotlin 程式碼的相容性 (例如,從 Java) 超出了本文檔的範圍。

語言

嘗試回滾以修復正確的約束處理

問題: KT-53813

組件: 核心語言

不相容變更類型: 原始碼

簡短摘要: 回滾在 1.7.0 中出現的修復類型推斷約束處理問題的嘗試,該問題是在實作 KT-52668 中描述的變更之後。 該嘗試是在 1.7.10 中進行的,但它反過來又引入了新的問題。

棄用週期:

  • 1.7.20: 回滾到 1.7.0 行為

禁止某些建構器推斷案例,以避免與多個 Lambda 表達式和解析產生問題的互動

問題: KT-53797

組件: 核心語言

不相容變更類型: 原始碼

簡短摘要: Kotlin 1.7 引入了一項名為無限制建構器推斷 (unrestricted builder inference) 的功能,以便即使傳遞給未用 @BuilderInference 註釋的參數的 Lambda 表達式也可以從建構器推斷中受益。 但是,如果函數調用中出現多個此類 Lambda 表達式,則可能會導致多個問題。

如果有多個 Lambda 函數需要使用建構器推斷來完成 Lambda 表達式中的類型推斷,並且相應的參數沒有用 @BuilderInference 註釋,Kotlin 1.7.20 將報告錯誤。

棄用週期:

  • 1.7.20: 在此類 Lambda 函數上報告錯誤,可以使用 -XXLanguage:+NoBuilderInferenceWithoutAnnotationRestriction 暫時恢復到 1.7.20 之前的行為