Kotlin 1.7 の互換性ガイド
Keeping the Language Modern と Comfortable Updates は、Kotlin言語設計における基本原則です。前者は、言語の進化を妨げる構造は削除されるべきであるとし、後者は、コードの移行を可能な限りスムーズにするために、この削除は事前に十分に周知されるべきであるとしています。
ほとんどの言語変更は、アップデートの変更履歴やコンパイラの警告など、他のチャネルを通じてすでに発表されていますが、このドキュメントではそれらすべてをまとめて、Kotlin 1.6からKotlin 1.7への移行のための完全なリファレンスを提供します。
基本的な用語
このドキュメントでは、いくつかの種類の互換性について説明します。
- source(ソース):ソース互換性のない変更とは、エラーや警告なしに正常にコンパイルされていたコードが、コンパイルできなくなる変更のことです。
- binary(バイナリ):2つのバイナリ成果物を互換性があると言うのは、それらを交換してもロードまたはリンケージのエラーが発生しない場合です。
- behavioral(動作):動作互換性のない変更とは、変更を適用する前と後で、同じプログラムが異なる動作を示す場合を指します。
これらの定義は、純粋な Kotlin に対してのみ与えられていることに注意してください。Kotlin コードの他の言語からの互換性 (たとえば、Java からの)は、このドキュメントの範囲外です。
言語
safe call(セーフコール)の結果を常にnullableにする
Issue: KT-46860
Component: Core language
Incompatible change type: source
Short summary: Kotlin 1.7では、safe call(セーフコール)の結果の型は、safe call(セーフコール)のreceiver(レシーバ)がnon-nullable(非null)であっても、常にnullable(null許容)とみなされます。
Deprecation cycle:
- <1.3: non-nullable(非null)のreceiver(レシーバ)に対する不要なsafe call(セーフコール)について警告を表示します
- 1.6.20: 不要なsafe call(セーフコール)の結果の型が次のバージョンで変更されることを追加で警告します
- 1.7.0: safe call(セーフコール)の結果の型をnullable(null許容)に変更します。
-XXLanguage:-SafeCallsAreAlwaysNullable
を使用すると、一時的に1.7より前の動作に戻すことができます。
abstract(抽象)superclass(スーパークラス)メンバーへのsuper call(スーパーコール)の委譲を禁止する
Issues: KT-45508, KT-49017, KT-38078
Component: Core language
Incompatible change type: source
Short summary: 明示的または暗黙的なsuper call(スーパーコール)がsuperclass(スーパークラス)の_abstract_(抽象)メンバーに委譲される場合、たとえsuper interface(スーパーインターフェース)にデフォルトの実装があったとしても、Kotlinはコンパイルエラーを報告します。
Deprecation cycle:
- 1.5.20: すべてのabstract(抽象)メンバーをオーバーライドしないnon-abstract(非抽象)クラスが使用された場合に警告を導入します
- 1.7.0: super call(スーパーコール)が、実際にはsuperclass(スーパークラス)からのabstract(抽象)メンバーにアクセスする場合、エラーを報告します
- 1.7.0:
-Xjvm-default=all
または-Xjvm-default=all-compatibility
互換モードが有効になっている場合、エラーを報告します。 progressive mode(プログレッシブモード)でエラーを報告します- >=1.8.0: すべての場合にエラーを報告します
non-public(非公開)のprimary constructor(プライマリコンストラクタ)で宣言されたpublic(公開)プロパティを通じてnon-public(非公開)の型を公開することを禁止する
Issue: KT-28078
Component: Core language
Incompatible change type: source
Short summary: Kotlin は、private(プライベート)なprimary constructor(プライマリコンストラクタ)でnon-public(非公開)の型を持つpublic(公開)プロパティを宣言することを禁止します。 別のパッケージからそのようなプロパティにアクセスすると、
IllegalAccessError
が発生する可能性があります。Deprecation cycle:
- 1.3.20: non-public(非公開)の型を持ち、non-public(非公開)のconstructor(コンストラクタ)で宣言されているpublic(公開)プロパティについて警告を報告します
- 1.6.20: この警告をprogressive mode(プログレッシブモード)でエラーに引き上げます
- 1.7.0: この警告をエラーに引き上げます
enum(列挙型)名で修飾された初期化されていないenum entries(列挙型エントリ)へのアクセスを禁止する
Issue: KT-41124
Component: Core language
Incompatible change type: source
Short summary: Kotlin 1.7では、これらのentries(エントリ)がenum(列挙型)名で修飾されている場合、enum(列挙型)のstatic initializer block(静的イニシャライザブロック)から初期化されていないenum entries(列挙型エントリ)へのアクセスを禁止します
Deprecation cycle:
- 1.7.0: 初期化されていないenum entries(列挙型エントリ)がenum(列挙型)のstatic initializer block(静的イニシャライザブロック)からアクセスされた場合にエラーを報告します
when条件分岐とloop(ループ)の条件における複雑なboolean expression(ブール式)の定数値を計算することを禁止する
Issue: KT-39883
Component: Core language
Incompatible change type: source
Short summary: Kotlin は、リテラル
true
およびfalse
以外の定数boolean expression(ブール式)に基づいて、exhaustiveness(網羅性)とcontrol flow(制御フロー)の仮定を行わなくなります。Deprecation cycle:
- 1.5.30:
when
のbranch(分岐)またはloop(ループ)の条件における複雑な定数boolean expression(ブール式)に基づいて、when
のexhaustiveness(網羅性)またはcontrol flow(制御フロー)の到達可能性が決定される場合に警告を報告します- 1.7.0: この警告をエラーに引き上げます
enum(列挙型)、sealed(シールド)型、およびBoolean(ブール)型のsubject(サブジェクト)を持つwhenステートメントをデフォルトでexhaustive(網羅的)にする
Issue: KT-47709
Component: Core language
Incompatible change type: source
Short summary: Kotlin 1.7では、enum(列挙型)、sealed(シールド)型、またはBoolean(ブール)型のsubject(サブジェクト)を持つ
when
ステートメントがnon-exhaustive(非網羅的)であるというエラーを報告しますDeprecation cycle:
- 1.6.0: enum(列挙型)、sealed(シールド)型、またはBoolean(ブール)型のsubject(サブジェクト)を持つ
when
ステートメントがnon-exhaustive(非網羅的)である場合に警告を導入します(progressive mode(プログレッシブモード)ではエラー)- 1.7.0: この警告をエラーに引き上げます
when-with-subjectの紛らわしい文法を非推奨にする
Issue: KT-48385
Component: Core language
Incompatible change type: source
Short summary: Kotlin 1.6では、
when
条件式におけるいくつかの紛らわしい文法構造が非推奨になりました。Deprecation cycle:
- 1.6.20: 影響を受ける式に非推奨の警告を導入します
- 1.8.0: この警告をエラーに引き上げます
- >= 1.8: いくつかの非推奨の構造を新しい言語機能のために再利用します
型nullability(Null許容性)の強化の改善
Issue: KT-48623
Component: Kotlin/JVM
Incompatible change type: source
Short summary: Kotlin 1.7では、Java コードの型nullability(Null許容性)annotation(アノテーション)のロードおよび解釈方法が変更されます。
Deprecation cycle:
- 1.4.30: より正確な型nullability(Null許容性)がエラーにつながる可能性がある場合に警告を導入します
- 1.7.0: Java型のより正確なnullability(Null許容性)を推論します。
-XXLanguage:-TypeEnhancementImprovementsInStrictMode
を使用すると、一時的に1.7より前の動作に戻すことができます。
異なる数値型間の暗黙的な型変換を禁止する
Issue: KT-48645
Component: Kotlin/JVM
Incompatible change type: behavioral
Short summary: Kotlin は、セマンティクス的にその型へのdowncast(ダウンキャスト)のみが必要な場合に、数値が自動的にプリミティブな数値型に変換されるのを回避します。
Deprecation cycle:
- < 1.5.30: 影響を受けるすべての場合における古い動作
- 1.5.30: 生成されたプロパティdelegate(デリゲート)accessor(アクセッサ)でdowncast(ダウンキャスト)の動作を修正します。
-Xuse-old-backend
を使用すると、一時的に1.5.30より前の修正動作に戻すことができます。- >= 1.7.20: 影響を受ける他のケースでdowncast(ダウンキャスト)の動作を修正します
コンパイラオプション-Xjvm-defaultのenable(有効化)モードとcompatibility(互換性)モードを非推奨にする
Issue: KT-46329
Component: Kotlin/JVM
Incompatible change type: source
Short summary: Kotlin 1.6.20 は、
-Xjvm-default
コンパイラオプションのenable
モードとcompatibility
モードの使用について警告します。Deprecation cycle:
- 1.6.20:
-Xjvm-default
コンパイラオプションのenable
モードとcompatibility
モードに警告を導入します- >= 1.8.0: この警告をエラーに引き上げます
末尾のlambda(ラムダ)を持つsuspendという名前の関数への呼び出しを禁止する
Issue: KT-22562
Component: Core language
Incompatible change type: source
Short summary: Kotlin 1.6 では、functional type(関数型)の単一の引数を末尾のlambda(ラムダ)として渡す
suspend
という名前のユーザー関数の呼び出しは許可されなくなりました。Deprecation cycle:
- 1.3.0: そのような関数の呼び出しに警告を導入します
- 1.6.0: この警告をエラーに引き上げます
- 1.7.0:
{
の前のsuspend
がキーワードとして解析されるように言語文法を変更します
base class(ベースクラス)が別のmodule(モジュール)からのものである場合、base class(ベースクラス)のプロパティに対するsmart cast(スマートキャスト)を禁止する
Issue: KT-52629
Component: Core language
Incompatible change type: source
Short summary: そのクラスが別のmodule(モジュール)にある場合、Kotlin 1.7 はsuperclass(スーパークラス)のプロパティに対するsmart cast(スマートキャスト)を許可しません。
Deprecation cycle:
- 1.6.0: 別のmodule(モジュール)にあるsuperclass(スーパークラス)で宣言されたプロパティに対するsmart cast(スマートキャスト)について警告を報告します
- 1.7.0: この警告をエラーに引き上げます。
-XXLanguage:-ProhibitSmartcastsOnPropertyFromAlienBaseClass
を使用すると、一時的に1.7より前の動作に戻すことができます。
型推論中に意味のあるconstraint(制約)を無視しない
Issue: KT-52668
Component: Core language
Incompatible change type: source
Short summary: Kotlin 1.4〜1.6 では、誤った最適化のために型推論中にいくつかの型constraint(制約)が無視されました。 それにより、実行時に
ClassCastException
を引き起こす可能性のある不正なコードの記述が許可される可能性がありました。 Kotlin 1.7 では、これらのconstraint(制約)が考慮されるため、不正なコードは禁止されますDeprecation cycle:
- 1.5.20: すべての型推論constraint(制約)が考慮された場合に型不一致が発生する式について警告を報告します
- 1.7.0: すべてのconstraint(制約)を考慮に入れ、この警告をエラーに引き上げます。
-XXLanguage:-ProperTypeInferenceConstraintsProcessing
を使用すると、一時的に1.7より前の動作に戻すことができます。
標準ライブラリ
collection(コレクション)のmin関数とmax関数の戻り値を段階的にnon-nullable(非null許容)に変更する
Issue: KT-38854
Component: kotlin-stdlib
Incompatible change type: source
Short summary: collection(コレクション)の
min
関数とmax
関数の戻り値の型は、Kotlin 1.7 で non-nullable(非null許容)に変更されますDeprecation cycle:
- 1.4.0:
...OrNull
関数を同義語として導入し、影響を受ける API を非推奨にします(詳細については、課題を参照してください)- 1.5.0: 影響を受ける API の非推奨レベルをエラーに引き上げます
- 1.6.0: 非推奨の関数をpublic API(公開API)から隠します
- 1.7.0: 影響を受ける API を再導入しますが、戻り値の型はnon-nullable(非null許容)になります
floating-point array(浮動小数点配列)関数:contains、indexOf、lastIndexOfを非推奨にする
Issue: KT-28753
Component: kotlin-stdlib
Incompatible change type: source
Short summary: Kotlin は、合計順序の代わりに IEEE-754 順序を使用して値を比較するfloating-point array(浮動小数点配列)関数
contains
、indexOf
、lastIndexOf
を非推奨にしますDeprecation cycle:
- 1.4.0: 警告付きで影響を受ける関数を非推奨にします
- 1.6.0: 非推奨レベルをエラーに引き上げます
- 1.7.0: 非推奨の関数をpublic API(公開API)から隠します
kotlin.dom パッケージおよび kotlin.browser パッケージから kotlinx.* へのdeclaration(宣言)の移行
Issue: KT-39330
Component: kotlin-stdlib (JS)
Incompatible change type: source
Short summary:
kotlin.dom
パッケージおよびkotlin.browser
パッケージからのdeclaration(宣言)は、stdlib から抽出する準備として、対応するkotlinx.*
パッケージに移動されます。Deprecation cycle:
- 1.4.0:
kotlinx.dom
パッケージおよびkotlinx.browser
パッケージに代替 API を導入します- 1.4.0:
kotlin.dom
パッケージおよびkotlin.browser
パッケージの API を非推奨にし、上記の新しい API を代替として提案します- 1.6.0: 非推奨レベルをエラーに引き上げます
- >= 1.8: 非推奨の関数を stdlib から削除します
- >= 1.8: kotlinx.* パッケージの API を個別のライブラリに移動します
一部の JS 専用 API を非推奨にする
Issue: KT-48587
Component: kotlin-stdlib (JS)
Incompatible change type: source
Short summary: stdlib の多数の JS 専用関数は、削除のために非推奨になりました。それらには、
String.concat(String)
、String.match(regex: String)
、String.matches(regex: String)
、および比較関数を取る配列のsort
関数(たとえば、Array<out T>.sort(comparison: (a: T, b: T)
->Int)
)が含まれます。Deprecation cycle:
- 1.6.0: 警告付きで影響を受ける関数を非推奨にします
- 1.8.0: 非推奨レベルをエラーに引き上げます
- 1.9.0: 非推奨の関数をpublic API(公開API)から削除します
ツール
KotlinGradleSubplugin クラスを削除する
Issue: KT-48831
Component: Gradle
Incompatible change type: source
Short summary:
KotlinGradleSubplugin
クラスを削除します。代わりにKotlinCompilerPluginSupportPlugin
クラスを使用してくださいDeprecation cycle:
- 1.6.0: 非推奨レベルをエラーに引き上げます
- 1.7.0: 非推奨のクラスを削除します
useIR コンパイラオプションを削除する
Issue: KT-48847
Component: Gradle
Incompatible change type: source
Short summary: 非推奨で非表示の
useIR
コンパイラオプションを削除しますDeprecation cycle:
- 1.5.0: 非推奨レベルを警告に引き上げます
- 1.6.0: オプションを非表示にします
- 1.7.0: 非推奨のオプションを削除します
kapt.use.worker.api Gradle プロパティを非推奨にする
Issue: KT-48826
Component: Gradle
Incompatible change type: source
Short summary: Gradle Workers API を介して kapt の実行を許可する
kapt.use.worker.api
プロパティを非推奨にします(デフォルト: true)Deprecation cycle:
- 1.6.20: 非推奨レベルを警告に引き上げます
- >= 1.8.0: このプロパティを削除します
kotlin.experimental.coroutines Gradle DSL オプションおよび kotlin.coroutines Gradle プロパティを削除する
Issue: KT-50494
Component: Gradle
Incompatible change type: source
Short summary:
kotlin.experimental.coroutines
Gradle DSL オプションおよびkotlin.coroutines
プロパティを削除しますDeprecation cycle:
- 1.6.20: 非推奨レベルを警告に引き上げます
- 1.7.0: DSL オプション、それを囲む
experimental
ブロック、およびプロパティを削除します
useExperimentalAnnotation コンパイラオプションを非推奨にする
Issue: KT-47763
Component: Gradle
Incompatible change type: source
Short summary: module(モジュール)で API の使用を選択するために使用される、非表示の
useExperimentalAnnotation()
Gradle 関数を削除します。 代わりにoptIn()
関数を使用できますDeprecation cycle:
- 1.6.0: 非推奨オプションを非表示にします
- 1.7.0: 非推奨のオプションを削除します
kotlin.compiler.execution.strategy システムプロパティを非推奨にする
Issue: KT-51830
Component: Gradle
Incompatible change type: source
Short summary: コンパイラの実行戦略を選択するために使用される
kotlin.compiler.execution.strategy
システムプロパティを非推奨にします。 代わりに、Gradle プロパティkotlin.compiler.execution.strategy
またはコンパイルタスクプロパティcompilerExecutionStrategy
を使用してくださいDeprecation cycle:
- 1.7.0: 非推奨レベルを警告に引き上げます
- > 1.7.0: プロパティを削除します
kotlinOptions.jdkHome コンパイラオプションを削除する
Issue: KT-46541
Component: Gradle
Incompatible change type: source
Short summary: デフォルトの
JAVA_HOME
の代わりに、指定された場所からカスタム JDK をclasspath(クラスパス)に含めるために使用されるkotlinOptions.jdkHome
コンパイラオプションを削除します。代わりに Java toolchains を使用してくださいDeprecation cycle:
- 1.5.30: 非推奨レベルを警告に引き上げます
- > 1.7.0: オプションを削除します
noStdlib コンパイラオプションを削除する
Issue: KT-49011
Component: Gradle
Incompatible change type: source
Short summary:
noStdlib
コンパイラオプションを削除します。Gradle プラグインは、Kotlin 標準ライブラリが存在するかどうかを制御するために、kotlin.stdlib.default.dependency=true
プロパティを使用します。Deprecation cycle:
- 1.5.0: 非推奨レベルを警告に引き上げます
- 1.7.0: オプションを削除します
kotlin2js プラグインおよび kotlin-dce-plugin プラグインを削除する
Issue: KT-48276
Component: Gradle
Incompatible change type: source
Short summary:
kotlin2js
プラグインおよびkotlin-dce-plugin
プラグインを削除します。kotlin2js
の代わりに、新しいorg.jetbrains.kotlin.js
プラグインを使用します。 Dead code elimination (DCE)(未使用コード削除)は、Kotlin/JS Gradle プラグインが適切に構成されている場合に機能します
Deprecation cycle:
- 1.4.0: 非推奨レベルを警告に引き上げます
- 1.7.0: プラグインを削除します
コンパイルタスクの変更
Issue: KT-32805
Component: Gradle
Incompatible change type: source
Short summary: Kotlin コンパイルタスクは Gradle
AbstractCompile
タスクを継承しなくなったため、sourceCompatibility
入力とtargetCompatibility
入力は Kotlin ユーザーのスクリプトでは使用できなくなりました。SourceTask.stableSources
入力は使用できなくなりました。sourceFilesExtensions
入力が削除されました。 非推奨のGradle destinationDir: File
出力はdestinationDirectory: DirectoryProperty
出力に置き換えられました。KotlinCompile
タスクのclasspath
プロパティは非推奨になりました。Deprecation cycle:
- 1.7.0: 入力は使用できなくなり、出力は置き換えられ、
classpath
プロパティは非推奨になります