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-default
のenable
モードと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許容の戻り値の型で再導入する
浮動小数点配列関数:contains
、indexOf
、lastIndexOf
を非推奨にする
課題: KT-28753
コンポーネント:
kotlin-stdlib
非互換な変更の種類: ソース
概要: Kotlinでは、全順序ではなくIEEE-754順序を使用して値を比較する浮動小数点配列関数
contains
、indexOf
、lastIndexOf
を非推奨にします。非推奨サイクル:
- 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オプションとプロパティを削除する