Kotlin 2.0 の互換性ガイド
Keeping the Language Modern および Comfortable Updates は、Kotlin言語設計における基本原則の1つです。前者は、言語の進化を妨げる構造は削除されるべきであるとし、後者は、コードの移行を可能な限りスムーズにするために、この削除は事前に十分に周知されるべきであるとしています。
言語の変更点のほとんどは、更新された変更履歴やコンパイラーの警告など、他のチャネルを通じてすでに発表されていますが、このドキュメントでは、Kotlin 1.9からKotlin 2.0への移行に関する完全なリファレンスを提供します。
Kotlin K2コンパイラーはKotlin 2.0の一部として導入されました。新しいコンパイラーの利点、移行中に発生する可能性のある変更、および以前のコンパイラーへのロールバック方法については、K2 compiler migration guideを参照してください。
基本用語
このドキュメントでは、いくつかの種類の互換性について説明します。
- source(ソース互換性):ソース非互換の変更により、正常にコンパイルできていた(エラーや警告なしに)コードがコンパイルできなくなります。
- binary(バイナリ互換性):2つのバイナリアーティファクトを相互に交換しても、ロードエラーやリンケージエラーが発生しない場合、それらはバイナリ互換性があると言えます。
- behavioral(動作互換性):変更を適用する前と後で、同じプログラムが異なる動作を示す場合、その変更は動作非互換であると言えます。
これらの定義は、純粋なKotlinに対してのみ与えられていることに注意してください。他の言語の視点(たとえば、Javaから見た場合)からのKotlinコードの互換性は、このドキュメントの範囲外です。
言語
射影されたレシーバー上の合成セッターの使用を非推奨にする
Issue: KT-54309
Component: Core language
Incompatible change type: source
Short summary: Javaクラスの合成セッターを使用して、そのクラスの射影された型と競合する型を割り当てると、エラーがトリガーされます。
Deprecation cycle:
- 1.8.20: 合成プロパティセッターが反変の位置に射影されたパラメーター型を持ち、呼び出しサイトの引数型が互換性がない場合に警告を報告します。
- 2.0.0: 警告をエラーに格上げします。
Javaサブクラスでオーバーロードされたインラインクラスパラメーターを持つ関数を呼び出す際の正しいマングリング
Issue: KT-56545
Component: Core language
Incompatible change type: behavioral
Deprecation cycle:
- 2.0.0: 関数呼び出しで正しいマングリング動作を使用します。以前の動作に戻すには、
-XXLanguage:-MangleCallsToJavaMethodsWithValueClasses
コンパイラーオプションを使用します。
反変キャプチャ型に対する正しい型近似アルゴリズム
Issue: KT-49404
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 1.8.20: 問題のある呼び出しで警告を報告します。
- 2.0.0: 警告をエラーに格上げします。
プロパティの初期化前にプロパティ値へのアクセスを禁止する
Issue: KT-56408
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 2.0.0: 影響を受けるコンテキストで、初期化前にプロパティにアクセスするとエラーを報告します。
同じ名前でインポートされたクラスがあいまいな場合にエラーを報告する
Issue: KT-57750
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 2.0.0: スターインポートでインポートされた複数のパッケージに存在するクラス名を解決する際にエラーを報告します。
デフォルトで invokedynamic および LambdaMetafactory を介して Kotlin ラムダを生成する
Issue: KT-45375
Component: Core language
Incompatible change type: behavioral
Deprecation cycle:
- 2.0.0: 新しい動作を実装します。ラムダはデフォルトで
invokedynamic
およびLambdaMetafactory
を使用して生成されます。
式が必要な場合に、1つのブランチを持つ if 条件を禁止する
Issue: KT-57871
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 2.0.0:
if
条件にブランチが1つしかない場合にエラーを報告します。
ジェネリック型のスタープロジェクションを渡すことによる自己上限の違反を禁止する
Issue: KT-61718
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 2.0.0: ジェネリック型のスタープロジェクションを渡すことによって自己上限が違反された場合にエラーを報告します。
プライベートインライン関数の戻り値の型で匿名型を近似する
Issue: KT-54862
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 1.9.0: 推論された戻り値の型に匿名型が含まれている場合、プライベートインライン関数で警告を報告します。
- 2.0.0: このようなプライベートインライン関数の戻り値の型をスーパータイプに近似します。
ローカル関数型プロパティのinvoke規約よりもローカル拡張関数呼び出しを優先するようにオーバーロード解決の動作を変更する
Issue: KT-37592
Component: Core language
Incompatible change type: behavioral
Deprecation cycle:
- 2.0.0: 新しいオーバーロード解決の動作。関数呼び出しは、invoke規約よりも一貫して優先されます。
バイナリ依存関係からのスーパークラスの変更により、継承されたメンバーの競合が発生した場合にエラーを報告する
Issue: KT-51194
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 1.7.0: バイナリ依存関係からのスーパークラスで継承されたメンバーの競合が発生した場合、宣言で CONFLICTING_INHERITED_MEMBERS_WARNING 警告を報告します。
- 2.0.0: 警告をエラーに格上げします。CONFLICTING_INHERITED_MEMBERS
不変型におけるパラメータの @UnsafeVariance アノテーションを無視する
Issue: KT-57609
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 2.0.0: 新しい動作を実装します。
@UnsafeVariance
アノテーションは、反変パラメータの型の不一致に関するエラーを報告する際に無視されます。
コンパニオンオブジェクトのメンバーへのコール外部参照の型を変更する
Issue: KT-54316
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 1.8.20: アンバウンド参照として推論されるコンパニオンオブジェクト関数参照型で警告を報告します。
- 2.0.0: コンパニオンオブジェクト関数参照がすべての使用コンテキストでバウンド参照として推論されるように動作を変更します。
プライベートインライン関数からの匿名型の公開を禁止する
Issue: KT-33917
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 1.3.0: プライベートインライン関数から返された匿名オブジェクトの独自のメンバーへの呼び出しで警告を報告します。
- 2.0.0: このようなプライベートインライン関数の戻り値の型をスーパータイプに近似し、匿名オブジェクトメンバーへの呼び出しを解決しません。
whileループのbreak後の不正なスマートキャストのエラーを報告する
Issue: KT-22379
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 2.0.0: 新しい動作を実装します。古い動作は、言語バージョン1.9に切り替えることで復元できます。
インターセクション型の変数に、そのインターセクション型のサブタイプではない値が割り当てられた場合にエラーを報告する
Issue: KT-53752
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 2.0.0: インターセクション型を持つ変数に、そのインターセクション型のサブタイプではない値が割り当てられた場合にエラーを報告します。
SAMコンストラクターで構築されたインターフェースに、オプトインが必要なメソッドが含まれている場合にオプトインを要求する
Issue: KT-52628
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 1.7.20: SAMコンストラクターを介した
OptIn
の使用法で警告を報告します。- 2.0.0: SAMコンストラクターを介した
OptIn
の使用法で警告をエラーに格上げします(または、OptIn
マーカーの重大度が警告の場合は警告を報告し続けます)。
型エイリアスコンストラクターにおける上限の違反を禁止する
Issue: KT-54066
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 1.8.0: 型エイリアスコンストラクターで上限が違反された場合に警告を導入します。
- 2.0.0: K2コンパイラーで警告をエラーに格上げします。
分解変数の実際の型を、指定された明示的な型と一致させる
Issue: KT-57011
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 2.0.0: 新しい動作を実装します。分解変数の実際の型は、指定された場合に明示的な型と一致するようになりました。
オプトインが必要なデフォルト値を持つパラメーター型を持つコンストラクターを呼び出すときにオプトインを要求する
Issue: KT-55111
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 1.8.20: オプトインが必要なパラメーター型を持つコンストラクター呼び出しで警告を報告します。
- 2.0.0: 警告をエラーに格上げします(または、
OptIn
マーカーの重大度が警告の場合は警告を報告し続けます)。
同じスコープレベルで同じ名前のプロパティとenumエントリ間のあいまいさを報告する
Issue: KT-52802
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 1.7.20: コンパイラーが同じスコープレベルでenumエントリの代わりにプロパティに解決される場合に警告を報告します。
- 2.0.0: コンパイラーが同じスコープレベルで同じ名前のプロパティとenumエントリの両方を検出した場合、K2コンパイラーであいまいさを報告します(古いコンパイラーでは警告をそのままにします)。
コンパニオンプロパティをenumエントリよりも優先するように修飾子の解決動作を変更する
Issue: KT-47310
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 2.0.0: 新しい解決動作を実装します。コンパニオンプロパティはenumエントリよりも優先されます。
非糖衣構文で記述された場合と同様に、invoke呼び出しのレシーバー型とinvoke関数型を解決する
Issue: KT-58260
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 2.0.0: invoke呼び出しのレシーバー型とinvoke関数型を、非糖衣構文で記述された場合と同様に個別に解決します。
プライベートクラスメンバーを非プライベートインライン関数を介して公開することを禁止する
Issue: KT-55179
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 1.9.0: 内部インライン関数からプライベートクラスコンパニオンオブジェクトメンバーを呼び出すと、
PRIVATE_CLASS_MEMBER_FROM_INLINE_WARNING
警告を報告します。- 2.0.0: この警告を
PRIVATE_CLASS_MEMBER_FROM_INLINE
エラーに格上げします。
射影されたジェネリック型における非null型のnull可能性を修正する
Issue: KT-54663
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 2.0.0: 新しい動作を実装します。射影された型は、すべてのインプレース非null型を考慮します。
接頭辞インクリメントの推論型を、inc()オペレーターの戻り値の型ではなく、ゲッターの戻り値の型に一致するように変更する
Issue: KT-57178
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 2.0.0: 新しい動作を実装します。接頭辞インクリメントの推論型は、
inc()
オペレーターの戻り値の型ではなく、ゲッターの戻り値の型に一致するように変更されます。
スーパークラスで宣言されたジェネリック内部クラスから内部クラスを継承する場合、境界チェックを強制する
Issue: KT-61749
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 2.0.0: ジェネリック内部スーパークラスの型パラメーターの上限が違反された場合にエラーを報告します。
予想される型が関数型のパラメーターを持つ関数型である場合に、SAM型を持つ呼び出し可能な参照の割り当てを禁止する
Issue: KT-64342
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 2.0.0: 予想される型が関数型のパラメーターを持つ関数型である場合に、SAM型を持つ呼び出し可能な参照でコンパイルエラーを報告します。
コンパニオンオブジェクトのアノテーション解決のためにコンパニオンオブジェクトスコープを考慮する
Issue: KT-64299
Component: Core language
Incompatible change type: behavioral
Deprecation cycle:
- 2.0.0: 新しい動作を実装します。コンパニオンオブジェクトのアノテーション解決中にコンパニオンオブジェクトスコープが無視されなくなりました。
セーフコールと規約演算子の組み合わせに対する評価セマンティクスを変更する
Issue: KT-41034
Component: Core language
Incompatible change type: behavioral
Deprecation cycle:
- 1.4.0: 各不正な呼び出しで警告を報告します。
- 2.0.0: 新しい解決動作を実装します。
バッキングフィールドとカスタムセッターを持つプロパティがすぐに初期化されるように要求する
Issue: KT-58589
Component: Core language
Incompatible change type: behavioral
Deprecation cycle:
- 1.9.20: プライマリコンストラクターがない場合に
MUST_BE_INITIALIZED
警告を導入します。- 2.0.0: 警告をエラーに格上げします。
invokeオペレーター規約呼び出しで任意の式に対するUnit変換を禁止する
Issue: KT-61182
Component: Core language
Incompatible change type: behavioral
Deprecation cycle:
- 2.0.0: Unit変換が変数およびinvoke解決の任意の式に適用された場合にエラーを報告します。影響を受ける式で以前の動作を維持するには、
-XXLanguage:+UnitConversionsOnArbitraryExpressions
コンパイラーオプションを使用します。
フィールドがセーフコールでアクセスされた場合、null許容値を非null Javaフィールドに割り当てることを禁止する
Issue: KT-62998
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 2.0.0: null許容値が非null Javaフィールドに割り当てられた場合にエラーを報告します。
生の型パラメーターを含むJavaメソッドをオーバーライドするときに、スター射影型を要求する
Issue: KT-57600
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 2.0.0: 新しい動作を実装します。生の型パラメーターに対するオーバーライドは禁止されています。
Vにコンパニオンがある場合の(V)::foo参照解決を変更する
Issue: KT-47313
Component: Core language
Incompatible change type: behavioral
Deprecation cycle:
- 1.6.0: 現在コンパニオンオブジェクトインスタンスにバインドされている呼び出し可能な参照で警告を報告します。
- 2.0.0: 新しい動作を実装します。型の周りに括弧を追加しても、型のコンパニオンオブジェクトインスタンスへの参照にはなりません。
事実上パブリックなインライン関数での暗黙的な非パブリックAPIアクセスを禁止する
Issue: KT-54997
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 1.8.20: パブリックインライン関数で暗黙的な非パブリックAPIにアクセスすると、コンパイル警告を報告します。
- 2.0.0: 警告をエラーに格上げします。
プロパティゲッターでのuse-site getアノテーションを禁止する
Issue: KT-57422
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 1.9.0: ゲッターでのuse-site
get
アノテーションで警告を報告します(プログレッシブモードではエラー)。- 2.0.0: 警告を
INAPPLICABLE_TARGET_ON_PROPERTY
エラーに格上げします。-XXLanguage:-ProhibitUseSiteGetTargetAnnotations
を使用して警告に戻します。
ビルダー推論ラムダ関数で型パラメーターが上限に暗黙的に推論されるのを防ぐ
Issue: KT-47986
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 1.7.20: 型引数の型パラメーターが宣言された上限に推論できない場合に警告(またはプログレッシブモードではエラー)を報告します。
- 2.0.0: 警告をエラーに格上げします。
パブリックシグネチャでローカル型を近似するときにnull可能性を維持する
Issue: KT-53982
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 1.8.0: フレキシブル型はフレキシブルスーパータイプによって近似されます。宣言がnull許容である必要がある非null型を持つように推論された場合に、NPEを回避するために型を明示的に指定するように促す警告を報告します。
- 2.0.0: null許容型はnull許容スーパータイプによって近似されます。
スマートキャストの目的で false && ... および false || ... に対する特別な処理を削除する
Issue: KT-65776
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 2.0.0: 新しい動作を実装します。
false && ...
およびfalse || ...
に対する特別な処理はありません。
enumでのインラインオープン関数を禁止する
Issue: KT-34372
Component: Core language
Incompatible change type: source
Deprecation cycle:
- 1.8.0: enumでのインラインオープン関数で警告を報告します。
- 2.0.0: 警告をエラーに格上げします。
ツール
Gradleでの可視性の変更
Issue: KT-64653
Component: Gradle
Incompatible change type: source
Short summary: 以前は、特定のDSLコンテキストを対象とした特定のKotlin DSL関数およびプロパティが、誤って他のDSLコンテキストにリークしていました。
@KotlinGradlePluginDsl
アノテーションを追加しました。これにより、Kotlin GradleプラグインDSL関数およびプロパティが、意図されていないレベルに公開されるのを防ぎます。次のレベルは互いに分離されています。
- Kotlin 拡張機能
- Kotlin ターゲット
- Kotlin コンパイル
- Kotlin コンパイルタスク
Deprecation cycle:
- 2.0.0: ほとんどの場合、ビルドスクリプトが正しく構成されていない場合、コンパイラーは修正方法に関する提案を含む警告を報告します。それ以外の場合、コンパイラーはエラーを報告します。
kotlinOptions DSLを非推奨にする
Issue: KT-63419
Component: Gradle
Incompatible change type: source
Short summary:
kotlinOptions
DSLおよび関連するKotlinCompile<KotlinOptions>
タスクインターフェースを介してコンパイラーオプションを構成する機能は非推奨になりました。Deprecation cycle:
- 2.0.0: 警告を報告します。
KotlinCompilation DSLのcompilerOptionsを非推奨にする
Issue: KT-65568
Component: Gradle
Incompatible change type: source
Short summary:
KotlinCompilation
DSLのcompilerOptions
プロパティを構成する機能は非推奨になりました。Deprecation cycle:
- 2.0.0: 警告を報告します。
CInteropProcessの古い処理方法を非推奨にする
Issue: KT-62795
Component: Gradle
Incompatible change type: source
Short summary:
CInteropProcess
タスクおよびCInteropSettings
クラスは、defFile
およびdefFileProperty
の代わりにdefinitionFile
プロパティを使用するようになりました。これにより、
defFile
が動的に生成される場合に、CInteropProcess
タスクとdefFile
を生成するタスクの間に余分なdependsOn
関係を追加する必要がなくなります。Kotlin/Nativeプロジェクトでは、Gradleはビルドプロセスの後半で接続されたタスクが実行された後、
definitionFile
プロパティの存在を遅延して検証するようになりました。Deprecation cycle:
- 2.0.0:
defFile
およびdefFileProperty
パラメーターは非推奨になりました。
kotlin.useK2 Gradleプロパティを削除する
Issue: KT-64379
Component: Gradle
Incompatible change type: behavioral
Short summary:
kotlin.useK2
Gradleプロパティは削除されました。Kotlin 1.9.*では、K2コンパイラーを有効にするために使用できました。Kotlin 2.0.0以降では、K2コンパイラーはデフォルトで有効になっているため、プロパティは効果がなくなり、以前のコンパイラーに切り替えるために使用できません。Deprecation cycle:
- 1.8.20:
kotlin.useK2
Gradleプロパティは非推奨になりました。- 2.0.0:
kotlin.useK2
Gradleプロパティは削除されました。
非推奨のプラットフォームプラグインIDを削除する
Issue: KT-65187
Component: Gradle
Incompatible change type: source
Short summary: これらのプラットフォームプラグインIDのサポートは削除されました。
kotlin-platform-android
kotlin-platform-jvm
kotlin-platform-js
org.jetbrains.kotlin.platform.android
org.jetbrains.kotlin.platform.jvm
org.jetbrains.kotlin.platform.js
Deprecation cycle:
- 1.3: プラットフォームプラグインIDは非推奨です。
- 2.0.0: プラットフォームプラグインIDはサポートされなくなりました。
outputFile JavaScriptコンパイラーオプションを削除する
Issue: KT-61116
Component: Gradle
Incompatible change type: source
Short summary:
outputFile
JavaScriptコンパイラーオプションは削除されました。代わりに、コンパイルされたJavaScript出力ファイルが書き込まれるディレクトリーを指定するには、Kotlin2JsCompile
タスクのdestinationDirectory
プロパティを使用できます。Deprecation cycle:
- 1.9.25:
outputFile
コンパイラーオプションは非推奨です。- 2.0.0:
outputFile
コンパイラーオプションは削除されました。