Kotlin 1.6.x 互換性ガイド
「言語をモダンに保つ」および「快適なアップデート」は、Kotlin 言語設計における基本原則です。前者は言語の進化を妨げる構成要素は削除されるべきであることを示し、後者はコードの移行を可能な限りスムーズにするために、その削除について事前に十分に周知されるべきであることを示しています。
ほとんどの言語変更は、アップデートの変更履歴やコンパイラの警告など、他のチャネルを通じてすでに発表されていますが、このドキュメントではそれらすべてをまとめ、Kotlin 1.5 から Kotlin 1.6 への移行のための完全なリファレンスを提供します。
基本用語
このドキュメントでは、数種類の互換性について紹介します。
- ソース(source): ソース互換性のない変更は、以前は正常にコンパイルできていた(エラーや警告が出ていなかった)コードがコンパイルできなくなることを指します。
- バイナリ(binary): 2 つのバイナリアーティファクトを入れ替えてもロードエラーやリンケージエラーが発生しない場合、それらはバイナリ互換であると言います。
- 振る舞い(behavioral): 変更を適用する前後で、同じプログラムが異なる動作を示す場合、その変更は振る舞い互換性がないと言います。
これらの定義は純粋な Kotlin に対してのみ与えられていることに注意してください。他の言語の観点(例:Java)からの Kotlin コードの互換性は、このドキュメントの範囲外です。
言語(Language)
enum、sealed、Boolean を対象とする when 式をデフォルトで網羅的にする
Issue: KT-47709
コンポーネント: コア言語
互換性のない変更の種類: ソース
概要: Kotlin 1.6 では、
enum、sealed、またはBooleanを対象とするwhen式が網羅的(exhaustive)でない場合に警告が表示されます。非推奨化サイクル:
- 1.6.0:
enum、sealed、またはBooleanを対象とするwhen式が網羅的でない場合に警告を導入(プログレッシブモードではエラー)- 1.7.0: この警告をエラーに格上げ
when の条件式における紛らわしい文法の非推奨化
Issue: KT-48385
コンポーネント: コア言語
互換性のない変更の種類: ソース
概要: Kotlin 1.6 では、
whenの条件式におけるいくつかの紛らわしい文法構成を非推奨にします。非推奨化サイクル:
- 1.6.20: 該当する式に対して非推奨の警告を導入
- 1.8.0: この警告をエラーに格上げ
= 1.8: 非推奨となった一部の構成を、新しい言語機能のために再利用
コンパニオンオブジェクトおよびネストされたオブジェクトの super コンストラクタ呼び出しにおけるクラスメンバへのアクセス禁止
Issue: KT-25289
コンポーネント: コア言語
互換性のない変更の種類: ソース
概要: Kotlin 1.6 では、コンパニオンオブジェクトや通常のオブジェクトの
superコンストラクタ呼び出しの引数において、その引数のレシーバが包含する宣言を参照している場合にエラーを報告します。非推奨化サイクル:
- 1.5.20: 問題のある引数に対して警告を導入
- 1.6.0: この警告をエラーに格上げ。
-XXLanguage:-ProhibitSelfCallsInNestedObjectsを使用して、一時的に 1.6 以前の動作に戻すことが可能
型の Null 許容性の強化に関する改善
Issue: KT-48623
コンポーネント: Kotlin/JVM
互換性のない変更の種類: ソース
概要: Kotlin 1.7 では、Java コードにおける型の Null 許容性(nullability)アノテーションのロードおよび解釈方法が変更されます。
非推奨化サイクル:
- 1.4.30: より正確な型の Null 許容性がエラーにつながる可能性があるケースに対して警告を導入
- 1.7.0: Java 型のより正確な Null 許容性を推論。
-XXLanguage:-TypeEnhancementImprovementsInStrictModeを使用して、一時的に 1.7 以前の動作に戻すことが可能
異なる数値型間での暗黙的な型変換の防止
Issue: KT-48645
コンポーネント: Kotlin/JVM
互換性のない変更の種類: 振る舞い
概要: Kotlin は、意味的にその型へのダウンキャスト(downcast)のみが必要な場合に、数値をプリミティブな数値型へ自動的に変換することを避けるようになります。
非推奨化サイクル:
- < 1.5.30: 影響を受けるすべてのケースにおける以前の動作
- 1.5.30: 生成されたプロパティデリゲートアクセサにおけるダウンキャスト動作を修正。
-Xuse-old-backendを使用して、一時的に 1.5.30 の修正前の動作に戻すことが可能= 1.6.20: 他の影響を受けるケースにおけるダウンキャスト動作を修正
JLS に違反するコンテナアノテーションを持つ繰り返し可能なアノテーションクラスの宣言禁止
Issue: KT-47928
コンポーネント: Kotlin/JVM
互換性のない変更の種類: ソース
概要: Kotlin 1.6 では、繰り返し可能な(repeatable)アノテーションのコンテナアノテーションが JLS 9.6.3 と同じ要件(配列型の
valueメソッド、保持期間(retention)、およびターゲット)を満たしているかチェックします。非推奨化サイクル:
- 1.5.30: JLS 要件に違反する繰り返し可能なコンテナアノテーションの宣言に対して警告を導入(プログレッシブモードではエラー)
- 1.6.0: この警告をエラーに格上げ。
-XXLanguage:-RepeatableAnnotationContainerConstraintsを使用して、一時的にエラー報告を無効化することが可能
繰り返し可能なアノテーションクラス内での Container という名前のネストされたクラスの宣言禁止
Issue: KT-47971
コンポーネント: Kotlin/JVM
互換性のない変更の種類: ソース
概要: Kotlin 1.6 では、Kotlin で宣言された繰り返し可能なアノテーションが、事前定義された名前である
Containerというネストされたクラスを持っていないかチェックします。非推奨化サイクル:
- 1.5.30: Kotlin の繰り返し可能なアノテーションクラス内の
Containerという名前のネストされたクラスに対して警告を導入(プログレッシブモードではエラー)- 1.6.0: この警告をエラーに格上げ。
-XXLanguage:-RepeatableAnnotationContainerConstraintsを使用して、一時的にエラー報告を無効化することが可能
インターフェースのプロパティをオーバーライドするプライマリコンストラクタのプロパティに対する @JvmField の禁止
Issue: KT-32753
コンポーネント: Kotlin/JVM
互換性のない変更の種類: ソース
概要: Kotlin 1.6 では、インターフェースのプロパティをオーバーライドし、かつプライマリコンストラクタで宣言されたプロパティを
@JvmFieldアノテーションで修飾することを禁止します。非推奨化サイクル:
- 1.5.20: プライマリコンストラクタ内のそのようなプロパティに対する
@JvmFieldアノテーションに警告を導入- 1.6.0: この警告をエラーに格上げ。
-XXLanguage:-ProhibitJvmFieldOnOverrideFromInterfaceInPrimaryConstructorを使用して、一時的にエラー報告を無効化することが可能
コンパイラオプション -Xjvm-default の enable モードおよび compatibility モードの非推奨化
Issue: KT-46329
コンポーネント: Kotlin/JVM
互換性のない変更の種類: ソース
概要: Kotlin 1.6.20 では、
-Xjvm-defaultコンパイラオプションのenableモードおよびcompatibilityモードの使用について警告します。非推奨化サイクル:
- 1.6.20:
-Xjvm-defaultコンパイラオプションのenableモードおよびcompatibilityモードに対して警告を導入= 1.8.0: この警告をエラーに格上げ
公開 ABI インライン関数からの super 呼び出しの禁止
Issue: KT-45379
コンポーネント: コア言語
互換性のない変更の種類: ソース
概要: Kotlin 1.6 では、
publicまたはprotectedなインライン関数およびプロパティから、super修飾子を伴う関数呼び出しを禁止します。非推奨化サイクル:
- 1.5.0: 公開または保護されたインライン関数あるいはプロパティアクセサからの
super呼び出しに対して警告を導入- 1.6.0: この警告をエラーに格上げ。
-XXLanguage:-ProhibitSuperCallsFromPublicInlineを使用して、一時的にエラー報告を無効化することが可能
公開インライン関数からの protected コンストラクタ呼び出しの禁止
Issue: KT-48860
コンポーネント: コア言語
互換性のない変更の種類: ソース
概要: Kotlin 1.6 では、
publicまたはprotectedなインライン関数およびプロパティから、protectedコンストラクタを呼び出すことを禁止します。非推奨化サイクル:
- 1.4.30: 公開または保護されたインライン関数あるいはプロパティアクセサからの保護されたコンストラクタ呼び出しに対して警告を導入
- 1.6.0: この警告をエラーに格上げ。
-XXLanguage:-ProhibitProtectedConstructorCallFromPublicInlineを使用して、一時的にエラー報告を無効化することが可能
private-in-file 型からの非公開なネストされた型の公開禁止
Issue: KT-20094
コンポーネント: コア言語
互換性のない変更の種類: ソース
概要: Kotlin 1.6 では、
private-in-file型から、非公開(private)なネストされた型やインナークラスを公開することを禁止します。非推奨化サイクル:
- 1.5.0:
private-in-file型から公開されている非公開型に対して警告を導入- 1.6.0: この警告をエラーに格上げ。
-XXLanguage:-PrivateInFileEffectiveVisibilityを使用して、一時的にエラー報告を無効化することが可能
型に対するアノテーションにおいてアノテーションターゲットが解析されないケースの修正
Issue: KT-28449
コンポーネント: コア言語
互換性のない変更の種類: ソース
概要: Kotlin 1.6 では、型に対して適用されるべきでないアノテーションを、型に対して使用することを許可しなくなります。
非推奨化サイクル:
- 1.5.20: プログレッシブモードでエラーを導入
- 1.6.0: エラーを導入。
-XXLanguage:-ProperCheckAnnotationsTargetInTypeUsePositionsを使用して、一時的にエラー報告を無効化することが可能
末尾のラムダを伴う suspend という名前の関数の呼び出し禁止
Issue: KT-22562
コンポーネント: コア言語
互換性のない変更の種類: ソース
概要: Kotlin 1.6 では、関数型の単一の引数が末尾のラムダとして渡される、
suspendという名前の関数の呼び出しを許可しなくなります。非推奨化サイクル:
- 1.3.0: そのような関数呼び出しに対して警告を導入
- 1.6.0: この警告をエラーに格上げ
= 1.7.0: 言語文法に変更を導入し、
{の前のsuspendがキーワードとして解析されるように変更
標準ライブラリ(Standard library)
minus/removeAll/retainAll における不安定な contains 最適化の削除
Issue: KT-45438
コンポーネント: kotlin-stdlib
互換性のない変更の種類: 振る舞い
概要: Kotlin 1.6 では、コレクション、イテラブル、配列、シーケンスから複数の要素を削除する関数や演算子の引数に対して、
Setへの変換を行わなくなります。非推奨化サイクル:
- < 1.6: 以前の動作:一部のケースで引数が
Setに変換される- 1.6.0: 関数の引数がコレクションの場合、
Setには変換されなくなります。コレクションでない場合は、代わりにListに変換される可能性があります。JVM では、システムプロパティkotlin.collections.convert_arg_to_set_in_removeAll=trueを設定することで、以前の動作を一時的にオンにすることができます。= 1.7: 上記のシステムプロパティは効果がなくなります。
Random.nextLong における値生成アルゴリズムの変更
Issue: KT-47304
コンポーネント: kotlin-stdlib
互換性のない変更の種類: 振る舞い
概要: Kotlin 1.6 では、指定された範囲外の値を生成することを避けるため、
Random.nextLong関数の値生成アルゴリズムを変更します。非推奨化サイクル:
- 1.6.0: 直ちに動作を修正
コレクションの min および max 関数の戻り値の型を非 null に段階的に変更
Issue: KT-38854
コンポーネント: kotlin-stdlib
互換性のない変更の種類: ソース
概要: コレクションの
minおよびmax関数の戻り値の型は、Kotlin 1.7 で非 null(non-nullable)に変更されます。非推奨化サイクル:
- 1.4.0: 同義語として
...OrNull関数を導入し、影響を受ける API を非推奨化(詳細は Issue を参照)- 1.5.0: 影響を受ける API の非推奨レベルをエラーに格上げ
- 1.6.0: 非推奨の関数を公開 API から隠蔽
= 1.7: 影響を受ける API を、非 null の戻り値の型で再導入
浮動小数点配列関数 contains、indexOf、lastIndexOf の非推奨化
Issue: KT-28753
コンポーネント: kotlin-stdlib
互換性のない変更の種類: ソース
概要: Kotlin は、総順序(total order)ではなく IEEE-754 順序を使用して値を比較する浮動小数点配列関数
contains、indexOf、lastIndexOfを非推奨にします。非推奨化サイクル:
- 1.4.0: 該当する関数を警告付きで非推奨化
- 1.6.0: 非推奨レベルをエラーに格上げ
= 1.7: 非推奨の関数を公開 API から隠蔽
kotlin.dom および kotlin.browser パッケージからの宣言を kotlinx.* へ移行
Issue: KT-39330
コンポーネント: kotlin-stdlib (JS)
互換性のない変更の種類: ソース
概要: stdlib からの切り離しに備えて、
kotlin.domおよびkotlin.browserパッケージの宣言を対応する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 関数を非インライン化
Issue: KT-27738
コンポーネント: kotlin-stdlib (JS)
互換性のない変更の種類: ソース
概要: 関数型の
transformパラメータを持つRegex.replace関数は、Kotlin/JS においてインライン(inline)ではなくなります。非推奨化サイクル:
- 1.6.0: 該当する関数から
inline修飾子を削除
置換文字列にグループ参照が含まれる場合の JVM と JS での Regex.replace 関数の動作の違い
Issue: KT-28378
コンポーネント: kotlin-stdlib (JS)
互換性のない変更の種類: 振る舞い
概要: Kotlin/JS の
Regex.replace関数において、置換パターン文字列を使用する場合のパターンの構文を Kotlin/JVM と同じものに従うようにします。非推奨化サイクル:
- 1.6.0: Kotlin/JS stdlib の
Regex.replaceにおける置換パターンの処理を変更
JS の Regex における Unicode ケースフォールディングの使用
Issue: 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 の非推奨化
Issue: 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 から実装および相互運用固有の関数を隠蔽
Issue: KT-48587
コンポーネント: kotlin-stdlib (JS)
互換性のない変更の種類: ソース、バイナリ
概要: 関数
HashMap.createEntrySetおよびAbstactMutableCollection.toJSONの可視性をinternalに変更します。非推奨化サイクル:
- 1.6.0: 関数を
internalにし、公開 API から削除
ツール(Tools)
KotlinGradleSubplugin クラスの非推奨化
Issue: KT-48830
コンポーネント: Gradle
互換性のない変更の種類: ソース
概要:
KotlinGradleSubpluginクラスは、KotlinCompilerPluginSupportPluginに代わって非推奨になります。非推奨化サイクル:
- 1.6.0: 非推奨レベルをエラーに格上げ
= 1.7.0: 非推奨のクラスを削除
kotlin.useFallbackCompilerSearch ビルドオプションの削除
Issue: KT-46719
コンポーネント: Gradle
互換性のない変更の種類: ソース
概要: 非推奨となっていた 'kotlin.useFallbackCompilerSearch' ビルドオプションを削除します。
非推奨化サイクル:
- 1.5.0: 非推奨レベルを警告に格上げ
- 1.6.0: 非推奨のオプションを削除
いくつかのコンパイラオプションの削除
Issue: KT-48847
コンポーネント: Gradle
互換性のない変更の種類: ソース
概要: 非推奨となっていた
noReflectおよびincludeRuntimeコンパイラオプションを削除します。非推奨化サイクル:
- 1.5.0: 非推奨レベルをエラーに格上げ
- 1.6.0: 非推奨のオプションを削除
useIR コンパイラオプションの非推奨化
Issue: KT-48847
コンポーネント: Gradle
互換性のない変更の種類: ソース
概要: 非推奨となった
useIRコンパイラオプションを隠蔽します。非推奨化サイクル:
- 1.5.0: 非推奨レベルを警告に格上げ
- 1.6.0: オプションを隠蔽
= 1.7.0: 非推奨のオプションを削除
kapt.use.worker.api Gradle プロパティの非推奨化
Issue: KT-48826
コンポーネント: Gradle
互換性のない変更の種類: ソース
概要: Gradle Workers API 経由で kapt を実行することを可能にしていた
kapt.use.worker.apiプロパティを非推奨にします(デフォルトは true)。非推奨化サイクル:
- 1.6.20: 非推奨レベルを警告に格上げ
= 1.8.0: このプロパティを削除
kotlin.parallel.tasks.in.project Gradle プロパティの削除
Issue: KT-46406
コンポーネント: Gradle
互換性のない変更の種類: ソース
概要:
kotlin.parallel.tasks.in.projectプロパティを削除します。非推奨化サイクル:
- 1.5.20: 非推奨レベルを警告に格上げ
- 1.6.20: このプロパティを削除
kotlin.experimental.coroutines Gradle DSL オプションおよび kotlin.coroutines Gradle プロパティの非推奨化
Issue: KT-50369
コンポーネント: Gradle
互換性のない変更の種類: ソース
概要:
kotlin.experimental.coroutinesGradle DSL オプションおよびkotlin.coroutinesプロパティを非推奨にします。非推奨化サイクル:
- 1.6.20: 非推奨レベルを警告に格上げ
= 1.7.0: DSL オプションおよびプロパティを削除
