Kotlin 1.7.20 互換性ガイド
言語を現代的に保つ と 快適なアップデート は、Kotlin言語設計の基本原則の1つです。前者は、言語の進化を妨げる構成は削除されるべきであると述べており、後者は、コードの移行ができるだけスムーズに行われるように、この削除は事前に十分に伝達されるべきであると述べています。
通常、互換性のない変更は機能リリースでのみ発生しますが、今回はKotlin 1.7の変更によって導入された問題の拡散を制限するため、インクリメンタルリリースでそのような変更を2つ導入しなければなりません。
このドキュメントはそれらを要約し、Kotlin 1.7.0および1.7.10からKotlin 1.7.20への移行に関する参照を提供します。
基本的な用語
このドキュメントでは、いくつかの種類の互換性について説明します。
- ソース: ソース非互換の変更とは、かつては問題なく(エラーや警告なしで)コンパイルされていたコードが、コンパイルされなくなることです。
- バイナリ: 2つのバイナリ成果物は、それらを相互に交換してもロードまたはリンケージエラーが発生しない場合、バイナリ互換であるとされます。
- 振る舞い: 変更が振る舞い非互換であるとされるのは、その変更を適用する前後で、同じプログラムが異なる振る舞いを示す場合です。
これらの定義は純粋なKotlinに対してのみ与えられていることを覚えておいてください。他の言語の観点(例えばJava)からのKotlinコードの互換性は、このドキュメントの範囲外です。
言語
適切な制約処理を修正するためのロールバックの試み
Issue: KT-53813
コンポーネント: コア言語
互換性のない変更の種類: ソース
概要: KT-52668で説明されている変更の実装後に1.7.0で現れた、型推論の制約処理における問題を修正する試みをロールバックします。この試みは1.7.10で行われましたが、それは今度は新しい問題を引き起こしました。
非推奨サイクル:
- 1.7.20: 1.7.0の振る舞いにロールバック
複数のラムダと解決との問題のある相互作用を避けるため、一部のビルダー推論ケースを禁止する
Issue: KT-53797
コンポーネント: コア言語
互換性のない変更の種類: ソース
概要: Kotlin 1.7では、無制限ビルダー推論と呼ばれる機能が導入され、これによって
@BuilderInference
アノテーションが付けられていないパラメーターに渡されるラムダもビルダー推論の恩恵を受けることができました。しかし、そのようなラムダが関数呼び出し内に複数発生した場合、いくつかの問題を引き起こす可能性がありました。Kotlin 1.7.20では、対応するパラメーターに
@BuilderInference
アノテーションが付けられていないラムダ関数が複数あり、かつそのラムダ内の型の推論を完了するためにビルダー推論の使用を必要とする場合に、エラーを報告するようになります。非推奨サイクル:
- 1.7.20: そのようなラムダ関数でエラーを報告します。
-XXLanguage:+NoBuilderInferenceWithoutAnnotationRestriction
を使用して、一時的に1.7.20以前の振る舞いに戻すことができます。