Kotlin 1.7.20 の互換性ガイド
言語の現代性を保つ (Keeping the Language Modern) および 快適な更新 (Comfortable Updates) は、Kotlin言語設計の基本原則です。前者は、言語の進化を妨げる構文は削除されるべきであると述べており、後者は、この削除はコード移行を可能な限り円滑にするために、事前に十分に伝達されるべきであると述べています。
通常、互換性のない変更はフィーチャーリリースでのみ発生しますが、今回は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より前の動作に戻すことができます。