Kotlin 2.2.x 互換性ガイド
「言語をモダンに保つ」 および 「快適なアップデート」 は、Kotlin 言語設計における基本的な原則です。前者は言語の進化を妨げる構文を削除すべきであることを示し、後者はコードの移行を可能な限りスムーズにするために、その削除を事前に十分に周知すべきであることを示しています。
ほとんどの言語の変更は、アップデートの変更ログやコンパイラの警告などの他のチャネルを通じてすでに発表されていますが、このドキュメントではそれらをすべてまとめ、Kotlin 2.1 から Kotlin 2.2 への移行のための完全なリファレンスを提供します。
基本用語
このドキュメントでは、数種類の互換性について紹介します。
- ソース: ソース互換性のない(source-incompatible)変更は、以前は問題なく(エラーや警告なしで)コンパイルできていたコードをコンパイルできなくします。
- バイナリ: 2 つのバイナリアーティファクトを入れ替えても、ロードエラーやリンクエラーが発生しない場合、それらはバイナリ互換(binary-compatible)であると言います。
- 振る舞い: 変更の適用前後で同じプログラムが異なる動作を示す場合、その変更は振る舞いの互換性がない(behavioral-incompatible)と言います。
これらの定義は、純粋な Kotlin に対してのみ与えられていることに注意してください。他の言語の観点(例:Java)からの Kotlin コードの互換性は、このドキュメントの範囲外です。
言語
-language-version における 1.6 および 1.7 のサポート廃止
課題: KT-71793
コンポーネント: コンパイラ
互換性のない変更の種類: ソース
短い概要: Kotlin 2.2 以降、コンパイラは
-language-version=1.6または-language-version=1.7をサポートしなくなります。 これは、1.8 より古い言語機能セットがサポートされなくなることを意味します。ただし、言語自体は Kotlin 1.0 との完全な後方互換性を維持しています。非推奨化サイクル:
- 2.1.0:
-language-versionで 1.6 および 1.7 を使用したときに警告を報告- 2.2.0:
-language-versionで 1.8 および 1.9 を使用したときに警告を報告。1.6 および 1.7 については警告をエラーに引き上げ
アノテーション付きラムダでの invokedynamic をデフォルトで有効化
課題: KTLC-278
コンポーネント: 言語コア
互換性のない変更の種類: 振る舞い
短い概要: アノテーション付きのラムダは、デフォルトで
LambdaMetafactoryを介してinvokedynamicを使用するようになり、Java のラムダの動作と一致するようになります。 これは、生成されたラムダクラスからアノテーションを取得することに依存していたリフレクションベースのコードに影響します。 以前の動作に戻すには、-Xindy-allow-annotated-lambdas=falseコンパイラオプションを使用してください。非推奨化サイクル:
- 2.2.0: アノテーション付きラムダでの
invokedynamicをデフォルトで有効化
K2 において、展開後の型にバリアンスを持つ型エイリアスでのコンストラクタ呼び出しと継承を禁止
課題: KTLC-4
コンポーネント: 言語コア
互換性のない変更の種類: ソース
短い概要:
outなどのバリアンス(variance)修飾子を使用する型に展開される型エイリアス(type aliases)を使用したコンストラクタ呼び出しおよび継承は、K2 コンパイラでサポートされなくなりました。 これにより、元の型を使用することは許可されないのに、型エイリアスを介した同じ使用法が許可されていた不整合が解消されます。 移行するには、必要に応じて元の型を明示的に使用してください。非推奨化サイクル:
- 2.0.0: バリアンス修飾子を持つ型に展開される型エイリアスでのコンストラクタ呼び出しまたはスーパータイプとしての使用に対して警告を報告
- 2.2.0: 警告をエラーに引き上げ
Kotlin のゲッターからの合成プロパティを禁止
課題: KTLC-272
コンポーネント: 言語コア
互換性のない変更の種類: ソース
短い概要: Kotlin で定義されたゲッターに対する合成プロパティ(synthetic properties)は許可されなくなりました。 これは、Java クラスが Kotlin クラスを継承している場合や、
java.util.LinkedHashSetのようなマップされた型を扱う場合に影響します。 移行するには、プロパティアクセスを対応するゲッター関数の直接呼び出しに置き換えてください。非推奨化サイクル:
- 2.0.0: Kotlin のゲッターから作成された合成プロパティへのアクセスに対して警告を報告
- 2.2.0: 警告をエラーに引き上げ
JVM におけるインターフェース関数のデフォルトメソッド生成の変更
課題: KTLC-269
コンポーネント: 言語コア
互換性のない変更の種類: バイナリ
短い概要: インターフェースで宣言された関数は、特に設定されていない限り、JVM デフォルトメソッドとしてコンパイルされるようになりました。 これにより、関連のないスーパータイプが競合する実装を定義している場合に、Java コードでコンパイルエラーが発生する可能性があります。 この動作は、現在非推奨となっている
-Xjvm-defaultオプションに代わる、安定した-jvm-defaultコンパイラオプションによって制御されます。 デフォルトの実装がDefaultImplsクラスとサブクラスにのみ生成される以前の動作に戻すには、-jvm-default=disableを使用してください。非推奨化サイクル:
- 2.2.0:
-jvm-defaultコンパイラオプションのデフォルト値がenableに設定
アノテーションプロパティにおけるフィールドターゲットのアノテーションを禁止
課題: KTLC-7
コンポーネント: 言語コア
互換性のない変更の種類: ソース
短い概要: アノテーションプロパティにおけるフィールドターゲット(field-targeted)のアノテーションは許可されなくなりました。 これらのアノテーションに観測可能な効果はありませんでしたが、この変更はそれらに依存していたカスタム IR プラグインに影響を与える可能性があります。 移行するには、プロパティからフィールドターゲットのアノテーションを削除してください。
非推奨化サイクル:
- 2.1.0: アノテーションプロパティにおける
@JvmFieldアノテーションが警告付きで非推奨- 2.1.20: アノテーションプロパティにおけるすべてのフィールドターゲットのアノテーションに対して警告を報告
- 2.2.0: 警告をエラーに引き上げ
型エイリアスにおける reified 型パラメータを禁止
課題: KTLC-5
コンポーネント: 言語コア
互換性のない変更の種類: ソース
短い概要: 型エイリアス(type aliases)の型パラメータにおける
reified修飾子は許可されなくなりました。 reified 型パラメータはインライン関数内でのみ有効であるため、型エイリアスで使用しても効果はありませんでした。 移行するには、typealias宣言からreified修飾子を削除してください。非推奨化サイクル:
- 2.1.0: 型エイリアスにおける reified 型パラメータに対して警告を報告
- 2.2.0: 警告をエラーに引き上げ
Number および Comparable に対するインライン値クラスの型チェックを修正
課題: KTLC-21
コンポーネント: Kotlin/JVM
互換性のない変更の種類: 振る舞い
短い概要: インライン値クラス(inline value classes)は、
isおよびasチェックにおいてjava.lang.Numberまたはjava.lang.Comparableの実装として扱われなくなりました。 これらのチェックは、以前はボックス化されたインラインクラスに適用された際に誤った結果を返していました。 この最適化は現在、プリミティブ型とそのラッパーにのみ適用されます。非推奨化サイクル:
- 2.2.0: 新しい動作を有効化
間接的な依存関係からのアクセス不能なジェネリック型を禁止
課題: KTLC-3
コンポーネント: 言語コア
互換性のない変更の種類: ソース
短い概要: K2 コンパイラは、コンパイラから見えない間接的な依存関係からの型を使用している場合にエラーを報告するようになりました。 これは、依存関係が不足しているために参照されている型が利用できない場合の、ラムダパラメータやジェネリック型引数などのケースに影響します。
非推奨化サイクル:
- 2.0.0: ラムダ内のアクセス不能なジェネリック型、およびアクセス不能なジェネリック型引数の一部での使用に対してエラーを報告。ラムダ内のアクセス不能な非ジェネリック型、および式やスーパータイプ内のアクセス不能な型引数に対して警告を報告
- 2.1.0: ラムダ内のアクセス不能な非ジェネリック型に対する警告をエラーに引き上げ
- 2.2.0: 式内の型引数におけるアクセス不能な型引数に対する警告をエラーに引き上げ
型パラメータの境界に対する可視性チェックを強制
課題: KTLC-274
コンポーネント: 言語コア
互換性のない変更の種類: ソース
短い概要: 関数やプロパティは、宣言自体よりも制限の厳しい可視性(visibility)を持つ型パラメータ境界を使用できなくなりました。 これにより、以前はエラーなしでコンパイルされていても、実行時の失敗や一部のケースで IR 検証エラーにつながっていた、アクセス不能な型の間接的な露出を防ぐことができます。
非推奨化サイクル:
- 2.1.0: 型パラメータに、宣言の可視性スコープから見えない境界がある場合に警告を報告
- 2.2.0: 警告をエラーに引き上げ
非 private なインライン関数で private な型を公開している場合にエラーを報告
課題: KT-70916
コンポーネント: 言語コア
互換性のない変更の種類: ソース
短い概要: 非 private なインライン関数から private な型、関数、またはプロパティにアクセスすることは許可されなくなりました。 移行するには、private なエンティティの参照を避けるか、関数を private にするか、
inline修飾子を削除してください。inlineを削除するとバイナリ互換性が失われることに注意してください。非推奨化サイクル:
- 2.2.0: 非 private なインライン関数から private な型またはメンバーにアクセスしている場合にエラーを報告
パラメータのデフォルト値として使用されるラムダ内での非ローカルリターンを禁止
課題: KTLC-286
コンポーネント: 言語コア
互換性のない変更の種類: ソース
短い概要: パラメータのデフォルト値として使用されるラムダ内での非ローカルリターン(non-local return)ステートメントは許可されなくなりました。 このパターンは以前はコンパイルされていましたが、実行時のクラッシュを引き起こしていました。移行するには、非ローカルリターンを避けるようにラムダを書き直すか、ロジックをデフォルト値の外に移動してください。
非推奨化サイクル:
- 2.2.0: パラメータのデフォルト値として使用されるラムダ内の非ローカルリターンに対してエラーを報告
標準ライブラリ
kotlin.native.Throws の非推奨化
課題: KT-72137
コンポーネント: Kotlin/Native
互換性のない変更の種類: ソース
短い概要:
kotlin.native.Throwsは非推奨になりました。代わりに共通(common)のkotlin.Throwsアノテーションを使用してください。非推奨化サイクル:
- 1.9.0:
kotlin.native.Throwsを使用したときに警告を報告- 2.2.0: 警告をエラーに引き上げ
AbstractDoubleTimeSource の非推奨化
課題: KT-72137
コンポーネント: kotlin-stdlib
互換性のない変更の種類: ソース
短い概要:
AbstractDoubleTimeSourceは非推奨になりました。代わりにAbstractLongTimeSourceを使用してください。非推奨化サイクル:
- 1.8.20:
AbstractDoubleTimeSourceを使用したときに警告を報告- 2.2.0: 警告をエラーに引き上げ
ツール
ソースを置換するように KotlinCompileTool の setSource() 関数を修正
課題: KT-59632
コンポーネント: Gradle
互換性のない変更の種類: 振る舞い
短い概要:
KotlinCompileToolインターフェースのsetSource()関数は、設定されたソースに追加するのではなく、置換するようになりました。 既存のソースを置換せずにソースを追加したい場合は、source()関数を使用してください。非推奨化サイクル:
- 2.2.0: 新しい動作を有効化
KotlinCompilationOutput#resourcesDirProvider プロパティの非推奨化
課題: KT-70620
コンポーネント: Gradle
互換性のない変更の種類: ソース
短い概要:
KotlinCompilationOutput#resourcesDirProviderプロパティは非推奨になりました。 追加のリソースディレクトリを追加するには、Gradle ビルドスクリプトで代わりにKotlinSourceSet.resourcesを使用してください。非推奨化サイクル:
- 2.1.0:
KotlinCompilationOutput#resourcesDirProviderが警告付きで非推奨- 2.2.0: 警告をエラーに引き上げ
BaseKapt.annotationProcessorOptionProviders プロパティの非推奨化
課題: KT-58009
コンポーネント: Gradle
互換性のない変更の種類: ソース
短い概要:
BaseKapt.annotationProcessorOptionProvidersプロパティは、MutableList<Any>の代わりにListProperty<CommandLineArgumentProvider>を受け取るBaseKapt.annotationProcessorOptionsProvidersに代わって非推奨になりました。 これにより、期待される要素型が明確に定義され、ネストされたリストなどの誤った要素の追加による実行時の失敗を防ぐことができます。 現在のコードでリストを単一の要素として追加している場合は、add()関数をaddAll()関数に置き換えてください。非推奨化サイクル:
- 2.2.0: API で新しい型を強制
kotlin-android-extensions プラグインの非推奨化
課題: KT-72341
コンポーネント: Gradle
互換性のない変更の種類: ソース
短い概要:
kotlin-android-extensionsプラグインは非推奨になりました。Parcelable実装ジェネレータには別のプラグインkotlin-parcelizeを、合成ビュー(synthetic views)には Android Jetpack の ビューバインディング をそれぞれ代わりに使用してください。非推奨化サイクル:
- 1.4.20: プラグインが非推奨に
- 2.1.20: 設定エラーが導入され、プラグインのコードは実行されなくなりました
- 2.2.0: プラグインのコードが削除されました
- 2.4.0: プラグイン ID を削除
kotlinOptions DSL の非推奨化
課題: KT-54110
コンポーネント: Gradle
互換性のない変更の種類: ソース
短い概要:
kotlinOptionsDSL および関連するKotlinCompile<KotlinOptions>タスクインターフェースを介してコンパイラオプションを設定する機能は、新しいcompilerOptionsDSL に代わって非推奨になりました。 この非推奨化の一環として、kotlinOptionsインターフェース内のすべてのプロパティも個別に非推奨としてマークされました。 移行するには、compilerOptionsDSL を使用してコンパイラオプションを設定してください。移行の詳細については、Migrate fromkotlinOptions {}tocompilerOptions {}を参照してください。非推奨化サイクル:
- 2.0.0:
kotlinOptionsDSL に対して警告を報告- 2.2.0: 警告をエラーに引き上げ、
kotlinOptions内のすべてのプロパティを非推奨化
kotlin.incremental.useClasspathSnapshot プロパティの削除
課題: KT-62963
コンポーネント: Gradle
互換性のない変更の種類: ソース
短い概要:
kotlin.incremental.useClasspathSnapshotGradle プロパティが削除されました。 このプロパティは、Kotlin 1.8.20 以降でデフォルトで有効になっているクラスパスベースのアプローチに置き換えられた、非推奨の JVM 履歴ベースのインクリメンタルコンパイルモードを制御していました。非推奨化サイクル:
- 2.0.20:
kotlin.incremental.useClasspathSnapshotプロパティを警告付きで非推奨化- 2.2.0: プロパティを削除
Kotlin スクリプトに関する非推奨化
課題: KT-71685, KT-75632, KT-76196.
コンポーネント: スクリプティング
互換性のない変更の種類: ソース
短い概要: Kotlin 2.2.0 では以下のサポートが非推奨になります:
- REPL:
kotlincを介して REPL を引き続き使用するには、-Xreplコンパイラオプションでオプトインしてください。- JSR-223: JSR が Withdrawn(撤回) 状態であるためです。JSR-223 実装は言語バージョン 1.9 では引き続き動作しますが、将来的に K2 コンパイラへ移行する計画はありません。
KotlinScriptMojoMaven プラグイン。引き続き使用すると、コンパイラの警告が表示されます。詳細については、ブログポストを参照してください。
非推奨化サイクル:
- 2.1.0:
kotlincでの REPL の使用を警告付きで非推奨化- 2.2.0:
kotlincを介して REPL を使用するには、-Xreplコンパイラオプションでオプトインが必要。JSR-223 を非推奨化(言語バージョン 1.9 に切り替えることでサポートを復元可能)。KotlinScriptMojoMaven プラグインを非推奨化- 2.4.0:
KotlinScriptMojoMaven プラグインによる Kotlin スクリプト実行の削除
曖昧さ回避分類器プロパティの非推奨化
課題: KT-58231
コンポーネント: Gradle
互換性のない変更の種類: ソース
短い概要: Kotlin Gradle プラグインがソースセット名と IDE インポートの曖昧さを解消する方法を制御するために使用されていたオプションは、不要になりました。そのため、
KotlinTargetインターフェースの以下のプロパティは現在非推奨です:
useDisambiguationClassifierAsSourceSetNamePrefixoverrideDisambiguationClassifierOnIdeImport非推奨化サイクル:
- 2.0.0: これらの Gradle プロパティが使用されたときに警告を報告
- 2.1.0: 警告をエラーに引き上げ
- 2.2.0: Gradle プロパティを削除
コモナイゼーションパラメータの非推奨化
課題: KT-75161
コンポーネント: Gradle
互換性のない変更の種類: ソース
短い概要: 実験的なコモナイゼーション(commonization)モードのパラメータは、Kotlin Gradle プラグインで非推奨になりました。 これらのパラメータは、無効なコンパイルアーティファクトを生成し、それがキャッシュされる可能性があります。影響を受けるアーティファクトを削除するには:
gradle.propertiesファイルから以下のオプションを削除します:nonekotlin.mpp.enableOptimisticNumberCommonization kotlin.mpp.enablePlatformIntegerCommonization
~/.konan/*/klib/commonizedディレクトリ内のコモナイゼーションキャッシュをクリアするか、以下のコマンドを実行します:bash./gradlew cleanNativeDistributionCommonization非推奨化サイクル:
- 2.2.0: コモナイゼーションパラメータをエラー付きで非推奨化
- 2.2.20: コモナイゼーションパラメータを削除
レガシーなメタデータコンパイルのサポートを非推奨化
課題: KT-61817
コンポーネント: Gradle
互換性のない変更の種類: ソース
短い概要: 階層構造をセットアップし、共通ソースセットと中間ソースセットの間に中間ソースセットを作成するために使用されていたオプションは、不要になりました。 以下のコンパイラオプションが削除されます:
isCompatibilityMetadataVariantEnabledwithGranularMetadataisKotlinGranularMetadataEnabled非推奨化サイクル:
- 2.2.0: Kotlin Gradle プラグインからコンパイラオプションを削除
KotlinCompilation.source API の非推奨化
課題: KT-64991
コンポーネント: Gradle
互換性のない変更の種類: ソース
短い概要: Kotlin ソースセットを Kotlin コンパイルに直接追加できる
KotlinCompilation.sourceAPI へのアクセスが非推奨になりました。非推奨化サイクル:
- 1.9.0:
KotlinCompilation.sourceが使用されたときに警告を報告- 1.9.20: 警告をエラーに引き上げ
- 2.2.0: Kotlin Gradle プラグインから
KotlinCompilation.sourceを削除。これを使用しようとすると、ビルドスクリプトのコンパイル中に "unresolved reference" エラーが発生します。
ターゲットプリセット API の非推奨化
課題: KT-71698
コンポーネント: Gradle
互換性のない変更の種類: ソース
短い概要: Kotlin Multiplatform ターゲットのターゲットプリセット(target presets)は不要になりました。
jvm()やiosSimulatorArm64()などのターゲット DSL 関数が同じユースケースをカバーするようになったためです。プリセット関連のすべての API は非推奨です:
org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtensionのpresetsプロパティorg.jetbrains.kotlin.gradle.plugin.KotlinTargetPresetインターフェースとそのすべての継承クラスfromPresetオーバーロード非推奨化サイクル:
- 1.9.20: プリセット関連 API のあらゆる使用に対して警告を報告
- 2.0.0: 警告をエラーに引き上げ
- 2.2.0: Kotlin Gradle プラグインの公開 API からプリセット関連 API を削除。これらを使用しているソースは "unresolved reference" エラーで失敗し、バイナリ(例:Gradle プラグイン)は、最新バージョンの Kotlin Gradle プラグインに対して再コンパイルされない限り、リンクエラーで失敗する可能性があります。
Apple ターゲットのショートカットを非推奨化
課題: KT-70615
コンポーネント: Gradle
互換性のない変更の種類: ソース
短い概要:
ios()、watchos()、およびtvos()ターゲットショートカットは、Kotlin Multiplatform DSL で非推奨になりました。 これらのショートカットは、Apple ターゲットのソースセット階層を部分的に作成するために設計されました。現在、Kotlin Multiplatform Gradle プラグインは、組み込みの階層テンプレートを提供しています。ショートカットの代わりにターゲットのリストを指定すると、プラグインがそれらの中間ソースセットを自動的にセットアップします。非推奨化サイクル:
- 1.9.20: ターゲットショートカットが使用されたときに警告を報告。代わりにデフォルトの階層テンプレートがデフォルトで有効になります
- 2.1.0: ターゲットショートカットが使用されたときにエラーを報告
- 2.2.0: Kotlin Multiplatform Gradle プラグインからターゲットショートカット DSL を削除
publishAllLibraryVariants() 関数の非推奨化
課題: KT-60623
コンポーネント: Gradle
互換性のない変更の種類: ソース
短い概要:
publishAllLibraryVariants()関数は非推奨になりました。これは Android ターゲットのすべてのビルドバリアントを公開するために設計されました。このアプローチは、特に複数のフレーバーやビルドタイプが使用されている場合に、バリアント解決の問題を引き起こす可能性があるため、現在は推奨されません。代わりに、ビルドバリアントを指定するpublishLibraryVariants()関数を使用してください。非推奨化サイクル:
- 2.2.0:
publishAllLibraryVariants()を非推奨化
android ターゲットの非推奨化
課題: KT-71608
コンポーネント: Gradle
互換性のない変更の種類: ソース
短い概要: 現在の Kotlin DSL において、
androidターゲット名は非推奨になりました。代わりにandroidTargetを使用してください。非推奨化サイクル:
- 1.9.0: Kotlin Multiplatform プロジェクトで
android名が使用された場合に非推奨警告を導入- 2.1.0: 警告をエラーに引き上げ
- 2.2.0: Kotlin Multiplatform Gradle プラグインから
androidターゲット DSL を削除
CInteropProcess における konanVersion の非推奨化
課題: KT-71069
コンポーネント: Gradle
互換性のない変更の種類: ソース
短い概要:
CInteropProcessタスクのkonanVersionプロパティは非推奨になりました。 代わりにCInteropProcess.kotlinNativeVersionを使用してください。非推奨化サイクル:
- 2.1.0:
konanVersionプロパティが使用されたときに警告を報告- 2.2.0: 警告をエラーに引き上げ
- 2.3.0: Kotlin Gradle プラグインから
konanVersionプロパティを削除
CInteropProcess における destinationDir の非推奨化
課題: KT-71068
コンポーネント: Gradle
互換性のない変更の種類: ソース
短い概要:
CInteropProcessタスクのdestinationDirプロパティは非推奨になりました。 代わりにCInteropProcess.destinationDirectory.set()関数を使用してください。非推奨化サイクル:
- 2.1.0:
destinationDirプロパティが使用されたときに警告を報告- 2.2.0: 警告をエラーに引き上げ
- 2.3.0: Kotlin Gradle プラグインから
destinationDirプロパティを削除
kotlinArtifacts API の非推奨化
課題: KT-74953
コンポーネント: Gradle
互換性のない変更の種類: ソース
短い概要: 実験的な
kotlinArtifactsAPI は非推奨になりました。最終的なネイティブバイナリを構築するには、Kotlin Gradle プラグインで利用可能な現在の DSL を使用してください。 移行に不十分な場合は、この YouTrack イシューにコメントを残してください。非推奨化サイクル:
- 2.2.0:
kotlinArtifactsAPI が使用されたときに警告を報告- 2.3.0: 警告をエラーに引き上げ
