Skip to content

Kotlin 1.6 互換性ガイド

_言語の現代性を保つことと、快適なアップデート_は、Kotlinの言語設計における基本的な原則です。前者は、言語の進化を妨げる構造は削除されるべきであると述べており、後者は、コードの移行が可能な限りスムーズになるように、この削除が事前に適切に伝えられるべきであると述べています。

ほとんどの言語の変更は、アップデートの変更履歴やコンパイラの警告など、他のチャネルですでに発表されていますが、このドキュメントはそれらすべてをまとめ、Kotlin 1.5からKotlin 1.6への移行のための完全なリファレンスを提供します。

基本的な用語

このドキュメントでは、いくつかの種類の互換性について説明します。

  • ソース: ソース非互換の変更とは、以前は(エラーや警告なしで)正常にコンパイルされていたコードが、コンパイルされなくなる変更のことです。
  • バイナリ: 2つのバイナリ成果物がバイナリ互換であるとは、それらを交換してもロードまたはリンクのエラーが発生しない場合のことです。
  • 振る舞い: 同じプログラムが変更適用前後で異なる振る舞いを示す場合、その変更は振る舞い非互換であると言われます。

これらの定義は、純粋なKotlinに対してのみ与えられていることに注意してください。他の言語の視点からのKotlinコードの互換性(例えばJavaから見た場合)は、このドキュメントの範囲外です。

言語

when文がenum、sealed、およびBooleanをsubjectとする場合に、デフォルトで網羅的になるようにする

課題: KT-47709

コンポーネント: コア言語

非互換な変更の種類: ソース

概要: Kotlin 1.6では、enum、sealed、またはBooleanをsubjectとするwhen文が非網羅的である場合に警告が表示されます。

非推奨サイクル:

  • 1.6.0: enum、sealed、またはBooleanをsubjectとするwhen文が非網羅的である場合に警告を導入(プログレッシブモードではエラー)
  • 1.7.0: この警告をエラーに引き上げる

subjectを持つwhenにおける紛らわしい文法を非推奨にする

課題: KT-48385

コンポーネント: コア言語

非互換な変更の種類: ソース

概要: Kotlin 1.6では、when条件式におけるいくつかの紛らわしい文法構造が非推奨になります。

非推奨サイクル:

  • 1.6.20: 影響を受ける式に対して非推奨の警告を導入
  • 1.8.0: この警告をエラーに引き上げる
  • = 1.8: 非推奨になった構造の一部を新しい言語機能のために再利用する

コンパニオンオブジェクトとネストされたオブジェクトのスーパーコンストラクタ呼び出しにおけるクラスメンバーへのアクセスを禁止する

課題: KT-25289

コンポーネント: コア言語

非互換な変更の種類: ソース

概要: Kotlin 1.6では、コンパニオンオブジェクトおよび通常のオブジェクトのスーパーコンストラクタ呼び出しの引数において、それらの引数のレシーバが包含する宣言を参照している場合にエラーが報告されます。

非推奨サイクル:

  • 1.5.20: 問題のある引数に対して警告を導入
  • 1.6.0: この警告をエラーに引き上げる。 -XXLanguage:-ProhibitSelfCallsInNestedObjects を使用して一時的に1.6より前の振る舞いに戻すことができます。

型のnull許容性強化の改善

課題: KT-48623

コンポーネント: Kotlin/JVM

非互換な変更の種類: ソース

概要: Kotlin 1.7では、Javaコードにおける型のnull許容性アノテーションの読み込みと解釈方法が変更されます。

非推奨サイクル:

  • 1.4.30: より厳密な型のnull許容性がエラーにつながる可能性があるケースで警告を導入
  • 1.7.0: Java型のより厳密なnull許容性を推論する。 -XXLanguage:-TypeEnhancementImprovementsInStrictMode を使用して一時的に1.7より前の振る舞いに戻すことができます。

異なる数値型間の暗黙的な型変換を禁止する

課題: KT-48645

コンポーネント: Kotlin/JVM

非互換な変更の種類: 振る舞い

概要: Kotlinでは、数値がセマンティックにその型へのダウンキャストのみが必要な場合に、プリミティブ数値型への自動変換を避けるようになります。

非推奨サイクル:

  • < 1.5.30: 影響を受けるすべてのケースでの以前の振る舞い
  • 1.5.30: 生成されたプロパティデリゲートアクセサにおけるダウンキャストの振る舞いを修正。 -Xuse-old-backend を使用して一時的に1.5.30修正以前の振る舞いに戻すことができます。
  • = 1.6.20: その他の影響を受けるケースにおけるダウンキャストの振る舞いを修正

コンテナアノテーションがJLSに違反する繰り返し可能なアノテーションクラスの宣言を禁止する

課題: KT-47928

コンポーネント: Kotlin/JVM

非互換な変更の種類: ソース

概要: Kotlin 1.6では、繰り返し可能なアノテーションのコンテナアノテーションがJLS 9.6.3と同じ要件(配列型の値メソッド、保持ポリシー、およびターゲット)を満たしているかどうかがチェックされます。

非推奨サイクル:

  • 1.5.30: JLS要件に違反する繰り返し可能なコンテナアノテーションの宣言に対して警告を導入(プログレッシブモードではエラー)
  • 1.6.0: この警告をエラーに引き上げる。 -XXLanguage:-RepeatableAnnotationContainerConstraints を使用して一時的にエラー報告を無効にすることができます。

繰り返し可能なアノテーションクラス内でのContainerという名前のネストされたクラスの宣言を禁止する

課題: KT-47971

コンポーネント: Kotlin/JVM

非互換な変更の種類: ソース

概要: Kotlin 1.6では、Kotlinで宣言された繰り返し可能なアノテーションが、事前定義されたContainerという名前のネストされたクラスを持たないことがチェックされます。

非推奨サイクル:

  • 1.5.30: Kotlinの繰り返し可能なアノテーションクラス内のContainerという名前のネストされたクラスに対して警告を導入(プログレッシブモードではエラー)
  • 1.6.0: この警告をエラーに引き上げる。 -XXLanguage:-RepeatableAnnotationContainerConstraints を使用して一時的にエラー報告を無効にすることができます。

プライマリコンストラクタ内のインターフェースプロパティをオーバーライドするプロパティに対する@JvmFieldの使用を禁止する

課題: KT-32753

コンポーネント: Kotlin/JVM

非互換な変更の種類: ソース

概要: Kotlin 1.6では、プライマリコンストラクタで宣言され、インターフェースプロパティをオーバーライドするプロパティに@JvmFieldアノテーションを付けることが禁止されます。

非推奨サイクル:

  • 1.5.20: プライマリコンストラクタ内のそのようなプロパティに対する@JvmFieldアノテーションに警告を導入
  • 1.6.0: この警告をエラーに引き上げる。 -XXLanguage:-ProhibitJvmFieldOnOverrideFromInterfaceInPrimaryConstructor を使用して一時的にエラー報告を無効にすることができます。

コンパイラオプション-Xjvm-defaultenableモードとcompatibilityモードを非推奨にする

課題: KT-46329

コンポーネント: Kotlin/JVM

非互換な変更の種類: ソース

概要: Kotlin 1.6.20では、-Xjvm-defaultコンパイラオプションのenableモードとcompatibilityモードの使用について警告が表示されます。

非推奨サイクル:

  • 1.6.20: -Xjvm-defaultコンパイラオプションのenableモードとcompatibilityモードに警告を導入
  • = 1.8.0: この警告をエラーに引き上げる

public-abiインライン関数からのスーパー呼び出しを禁止する

課題: KT-45379

コンポーネント: コア言語

非互換な変更の種類: ソース

概要: Kotlin 1.6では、publicまたはprotectedなインライン関数およびプロパティからsuper修飾子を持つ関数を呼び出すことが禁止されます。

非推奨サイクル:

  • 1.5.0: publicまたはprotectedなインライン関数またはプロパティアクセサからのスーパー呼び出しに警告を導入
  • 1.6.0: この警告をエラーに引き上げる。 -XXLanguage:-ProhibitSuperCallsFromPublicInline を使用して一時的にエラー報告を無効にすることができます。

publicインライン関数からのprotectedコンストラクタ呼び出しを禁止する

課題: KT-48860

コンポーネント: コア言語

非互換な変更の種類: ソース

概要: Kotlin 1.6では、publicまたはprotectedなインライン関数およびプロパティからprotectedコンストラクタを呼び出すことが禁止されます。

非推奨サイクル:

  • 1.4.30: publicまたはprotectedなインライン関数またはプロパティアクセサからのprotectedコンストラクタ呼び出しに警告を導入
  • 1.6.0: この警告をエラーに引き上げる。 -XXLanguage:-ProhibitProtectedConstructorCallFromPublicInline を使用して一時的にエラー報告を無効にすることができます。

ファイル内プライベート型からのプライベートネスト型のエクスポートを禁止する

課題: KT-20094

コンポーネント: コア言語

非互換な変更の種類: ソース

概要: Kotlin 1.6では、ファイル内プライベート型からのプライベートネスト型および内部クラスのエクスポートが禁止されます。

非推奨サイクル:

  • 1.5.0: ファイル内プライベート型からエクスポートされるプライベート型に警告を導入
  • 1.6.0: この警告をエラーに引き上げる。 -XXLanguage:-PrivateInFileEffectiveVisibility を使用して一時的にエラー報告を無効にすることができます。

型に対するアノテーションの場合、いくつかのケースでアノテーションのターゲットが分析されない

課題: KT-28449

コンポーネント: コア言語

非互換な変更の種類: ソース

概要: Kotlin 1.6では、型に適用すべきではない型に対するアノテーションを許可しなくなります。

非推奨サイクル:

  • 1.5.20: プログレッシブモードでエラーを導入
  • 1.6.0: エラーを導入。 -XXLanguage:-ProperCheckAnnotationsTargetInTypeUsePositions を使用して一時的にエラー報告を無効にすることができます。

末尾ラムダを持つsuspendという名前の関数呼び出しを禁止する

課題: KT-22562

コンポーネント: コア言語

非互換な変更の種類: ソース

概要: Kotlin 1.6では、末尾ラムダとして渡される関数型の単一引数を持つsuspendという名前の関数を呼び出すことを許可しなくなります。

非推奨サイクル:

  • 1.3.0: そのような関数呼び出しに警告を導入
  • 1.6.0: この警告をエラーに引き上げる
  • = 1.7.0: 言語の文法に変更を加え、{の前のsuspendがキーワードとしてパースされるようにする

標準ライブラリ

minus/removeAll/retainAllにおける壊れやすいcontains最適化の削除

課題: KT-45438

コンポーネント: kotlin-stdlib

非互換な変更の種類: 振る舞い

概要: Kotlin 1.6では、コレクション/イテラブル/配列/シーケンスから複数の要素を削除する関数および演算子の引数に対して、セットへの変換を行わなくなります。

非推奨サイクル:

  • < 1.6: 以前の振る舞い: 引数は一部のケースでセットに変換される
  • 1.6.0: 関数の引数がコレクションの場合、Setに変換されなくなります。コレクションではない場合、代わりにListに変換されることがあります。 JVMでは、システムプロパティ kotlin.collections.convert_arg_to_set_in_removeAll=true を設定することで、一時的に以前の振る舞いに戻すことができます。
  • = 1.7: 上記のシステムプロパティは効果がなくなります

Random.nextLongにおける値生成アルゴリズムの変更

課題: KT-47304

コンポーネント: kotlin-stdlib

非互換な変更の種類: 振る舞い

概要: Kotlin 1.6では、Random.nextLong関数の値生成アルゴリズムが変更され、指定された範囲外の値を生成するのを避けるようになります。

非推奨サイクル:

  • 1.6.0: 振る舞いは直ちに修正されます

コレクションのminおよびmax関数の戻り値の型を徐々に非null許容型に変更する

課題: KT-38854

コンポーネント: kotlin-stdlib

非互換な変更の種類: ソース

概要: コレクションのminおよびmax関数の戻り値の型は、Kotlin 1.7で非null許容型に変更されます。

非推奨サイクル:

  • 1.4.0: ...OrNull関数を同義語として導入し、影響を受けるAPIを非推奨にする(詳細は課題を参照)
  • 1.5.0: 影響を受けるAPIの非推奨レベルをエラーに引き上げる
  • 1.6.0: 非推奨の関数をパブリックAPIから隠す
  • = 1.7: 影響を受けるAPIを非null許容の戻り値の型で再導入する

浮動小数点配列関数:containsindexOflastIndexOfを非推奨にする

課題: KT-28753

コンポーネント: kotlin-stdlib

非互換な変更の種類: ソース

概要: Kotlinでは、全順序ではなくIEEE-754順序を使用して値を比較する浮動小数点配列関数containsindexOflastIndexOfを非推奨にします。

非推奨サイクル:

  • 1.4.0: 影響を受ける関数を警告付きで非推奨にする
  • 1.6.0: 非推奨レベルをエラーに引き上げる
  • = 1.7: 非推奨の関数をパブリックAPIから隠す

kotlin.domおよびkotlin.browserパッケージからの宣言をkotlinx.*に移行する

課題: KT-39330

コンポーネント: kotlin-stdlib (JS)

非互換な変更の種類: ソース

概要: kotlin.domおよびkotlin.browserパッケージからの宣言は、stdlibからの抽出に備えるため、対応するkotlinx.*パッケージに移動されます。

非推奨サイクル:

  • 1.4.0: kotlinx.domおよびkotlinx.browserパッケージで代替APIを導入
  • 1.4.0: kotlin.domおよびkotlin.browserパッケージのAPIを非推奨にし、上記の新しいAPIを代替として提案
  • 1.6.0: 非推奨レベルをエラーに引き上げる
  • = 1.7: 非推奨の関数をstdlibから削除する

  • = 1.7: kotlinx.*パッケージのAPIを別のライブラリに移動する

Kotlin/JSにおけるRegex.replace関数をインラインにしない

課題: KT-27738

コンポーネント: kotlin-stdlib (JS)

非互換な変更の種類: ソース

概要: 関数型のtransformパラメータを持つRegex.replace関数は、Kotlin/JSではインラインではなくなります。

非推奨サイクル:

  • 1.6.0: 影響を受ける関数からinline修飾子を削除

置換文字列がグループ参照を含む場合のJVMとJSにおけるRegex.replace関数の異なる振る舞い

課題: KT-28378

コンポーネント: kotlin-stdlib (JS)

非互換な変更の種類: 振る舞い

概要: Kotlin/JSのRegex.replace関数は、置換パターン文字列にKotlin/JVMと同じ構文に従うようになります。

非推奨サイクル:

  • 1.6.0: Kotlin/JSのstdlibにおけるRegex.replaceの置換パターン処理を変更

JS RegexでのUnicodeケースフォールディングの使用

課題: KT-45928

コンポーネント: kotlin-stdlib (JS)

非互換な変更の種類: 振る舞い

概要: Kotlin/JSのRegexクラスは、基盤となるJS正規表現エンジンを呼び出してUnicodeルールに従って文字を検索および比較する際に、unicodeフラグを使用するようになります。 これにより、JS環境の特定のバージョン要件が発生し、正規表現パターン文字列における不要なエスケープのより厳密な検証が引き起こされます。

非推奨サイクル:

  • 1.5.0: JS Regexクラスのほとんどの関数でUnicodeケースフォールディングを有効にする
  • 1.6.0: Regex.replaceFirst関数でUnicodeケースフォールディングを有効にする

一部のJS専用APIを非推奨にする

課題: KT-48587

コンポーネント: kotlin-stdlib (JS)

非互換な変更の種類: ソース

概要: stdlib内の一部のJS専用関数が削除のために非推奨になりました。これには、String.concat(String)String.match(regex: String)String.matches(regex: String)、および比較関数を取る配列のsort関数(例: Array<out T>.sort(comparison: (a: T, b: T) -> Int))が含まれます。

非推奨サイクル:

  • 1.6.0: 影響を受ける関数を警告付きで非推奨にする
  • 1.7.0: 非推奨レベルをエラーに引き上げる
  • 1.8.0: 非推奨の関数をパブリックAPIから削除する

Kotlin/JSのクラスのパブリックAPIから実装固有および相互運用固有の関数を隠す

課題: KT-48587

コンポーネント: kotlin-stdlib (JS)

非互換な変更の種類: ソース、バイナリ

概要: HashMap.createEntrySet関数とAbstactMutableCollection.toJSON関数の可視性がinternalに変更されます。

非推奨サイクル:

  • 1.6.0: 関数をinternalにし、パブリックAPIから削除する

ツール

KotlinGradleSubpluginクラスを非推奨にする

課題: KT-48830

コンポーネント: Gradle

非互換な変更の種類: ソース

概要: KotlinGradleSubpluginクラスはKotlinCompilerPluginSupportPluginに推奨されます。

非推奨サイクル:

  • 1.6.0: 非推奨レベルをエラーに引き上げる
  • = 1.7.0: 非推奨のクラスを削除する

kotlin.useFallbackCompilerSearchビルドオプションを削除する

課題: KT-46719

コンポーネント: Gradle

非互換な変更の種類: ソース

概要: 非推奨のkotlin.useFallbackCompilerSearchビルドオプションを削除します。

非推奨サイクル:

  • 1.5.0: 非推奨レベルを警告に引き上げる
  • 1.6.0: 非推奨オプションを削除する

いくつかのコンパイラオプションを削除する

課題: KT-48847

コンポーネント: Gradle

非互換な変更の種類: ソース

概要: 非推奨のnoReflectおよびincludeRuntimeコンパイラオプションを削除します。

非推奨サイクル:

  • 1.5.0: 非推奨レベルをエラーに引き上げる
  • 1.6.0: 非推奨オプションを削除する

useIRコンパイラオプションを非推奨にする

課題: KT-48847

コンポーネント: Gradle

非互換な変更の種類: ソース

概要: 非推奨のuseIRコンパイラオプションを隠します。

非推奨サイクル:

  • 1.5.0: 非推奨レベルを警告に引き上げる
  • 1.6.0: オプションを隠す
  • = 1.7.0: 非推奨オプションを削除する

kapt.use.worker.api Gradleプロパティを非推奨にする

課題: KT-48826

コンポーネント: Gradle

非互換な変更の種類: ソース

概要: Gradle Workers API経由でkaptを実行することを許可していたkapt.use.worker.apiプロパティ(デフォルト: true)を非推奨にします。

非推奨サイクル:

  • 1.6.20: 非推奨レベルを警告に引き上げる
  • = 1.8.0: このプロパティを削除する

kotlin.parallel.tasks.in.project Gradleプロパティを削除する

課題: KT-46406

コンポーネント: Gradle

非互換な変更の種類: ソース

概要: kotlin.parallel.tasks.in.projectプロパティを削除します。

非推奨サイクル:

  • 1.5.20: 非推奨レベルを警告に引き上げる
  • 1.6.20: このプロパティを削除する

kotlin.experimental.coroutines Gradle DSLオプションとkotlin.coroutines Gradleプロパティを非推奨にする

課題: KT-50369

コンポーネント: Gradle

非互換な変更の種類: ソース

概要: kotlin.experimental.coroutines Gradle DSLオプションとkotlin.coroutinesプロパティを非推奨にします。

非推奨サイクル:

  • 1.6.20: 非推奨レベルを警告に引き上げる
  • = 1.7.0: DSLオプションとプロパティを削除する