Kotlin 1.3 の互換性ガイド
Keeping the Language Modern と Comfortable Updates は、Kotlin言語設計における基本的な原則です。前者は、言語の進化を妨げる構造は削除されるべきであるとし、後者は、コードの移行をできる限りスムーズにするために、この削除は事前に十分に伝えられるべきであるとしています。
言語の変更のほとんどは、更新履歴やコンパイラの警告など、他のチャネルを通じてすでに発表されていますが、このドキュメントではそれらすべてを要約し、Kotlin 1.2からKotlin 1.3への移行に関する完全なリファレンスを提供します。
基本的な用語
このドキュメントでは、いくつかの種類の互換性を紹介します。
- Source (ソース): ソース互換性のない変更とは、(エラーや警告なしに) 正常にコンパイルされていたコードがコンパイルできなくなることです。
- Binary (バイナリ): 2つのバイナリ成果物がバイナリ互換であるとは、それらを交換しても、ロードまたはリンクのエラーが発生しない場合をいいます。
- Behavioral (動作): 変更が動作互換性がないとは、あるプログラムが、変更を適用する前と後で異なる動作を示す場合をいいます。
これらの定義は、純粋なKotlinに対してのみ与えられていることに注意してください。 Kotlinコードの他の言語の視点 (例えば、Javaから) からの互換性は、このドキュメントの範囲外です。
互換性のない変更
<clinit> 呼び出しに関するコンストラクタ引数の評価順序
Issue: KT-19532
Component: Kotlin/JVM
Incompatible change type: behavioral
Short summary: クラスの初期化に関する評価順序が1.3で変更されました
Deprecation cycle:
- <1.3: 古い動作 (詳細はIssueを参照)
- >= 1.3: 動作が変更されました。
-Xnormalize-constructor-calls=disable
を使用すると、一時的に1.3より前の動作に戻すことができます。このフラグのサポートは、次のメジャーリリースで削除される予定です。
アノテーションコンストラクタパラメータにgetterを対象としたアノテーションがない
Issue: KT-25287
Component: Kotlin/JVM
Incompatible change type: behavioral
Short summary: アノテーションコンストラクタパラメータのgetterを対象としたアノテーションは、1.3でクラスファイルに正しく書き込まれます
Deprecation cycle:
- <1.3: アノテーションコンストラクタパラメータのgetterを対象としたアノテーションは適用されません
- >=1.3: アノテーションコンストラクタパラメータのgetterを対象としたアノテーションは正しく適用され、生成されたコードに書き込まれます
クラスコンストラクタの @get: アノテーションのエラーがない
Issue: KT-19628
Component: Core language
Incompatible change type: Source
Short summary: getterを対象としたアノテーションのエラーは、1.3で正しく報告されます
Deprecation cycle:
- <1.2: getterを対象としたアノテーションのコンパイルエラーは報告されず、不正なコードが正常にコンパイルされていました。
- 1.2.x: エラーはツールによってのみ報告され、コンパイラは警告なしにそのようなコードをコンパイルします
- >=1.3: エラーはコンパイラによっても報告され、誤ったコードは拒否されます
@NotNull でアノテーションされた Java 型へのアクセスに対する Nullability assertions
Issue: KT-20830
Component: Kotlin/JVM
Incompatible change type: Behavioral
Short summary: not-null アノテーションでアノテーションされた Java 型の nullability assertions は、より積極的に生成されるようになり、ここで
null
を渡すコードはより早く失敗します。Deprecation cycle:
- <1.3: 型推論が関係している場合、コンパイラはそのような assertions を見逃す可能性があり、バイナリに対してコンパイル中に潜在的な
null
伝播を許可していました (詳細はIssueを参照)。- >=1.3: コンパイラは見逃した assertions を生成します。これにより、(誤って) ここに
null
を渡していたコードはより早く失敗する可能性があります。-XXLanguage:-StrictJavaNullabilityAssertions
を使用すると、一時的に1.3より前の動作に戻すことができます。このフラグのサポートは、次のメジャーリリースで削除される予定です。
enum メンバに対する不健全なスマートキャスト
Issue: KT-20772
Component: Core language
Incompatible change type: Source
Short summary: 1つの enum エントリのメンバに対するスマートキャストは、この enum エントリにのみ正しく適用されます
Deprecation cycle:
- <1.3: 1つの enum エントリのメンバに対するスマートキャストは、他の enum エントリの同じメンバに対する不健全なスマートキャストにつながる可能性がありました。
- >=1.3: スマートキャストは、1つの enum エントリのメンバにのみ正しく適用されます。
-XXLanguage:-SoundSmartcastForEnumEntries
は、一時的に古い動作に戻します。このフラグのサポートは、次のメジャーリリースで削除される予定です。
getter での val backing field の再代入
Issue: KT-16681
Components: Core language
Incompatible change type: Source
Short summary: getter での
val
プロパティの backing field の再代入は禁止されるようになりましたDeprecation cycle:
- <1.2: Kotlin コンパイラは、getter で
val
の backing field を変更することを許可していました。これは Kotlin のセマンティクスに違反するだけでなく、final
フィールドを再代入する不正な JVM バイトコードを生成します。- 1.2.X:
val
の backing field を再代入するコードで、非推奨の警告が報告されます- >=1.3: 非推奨の警告はエラーに昇格します
反復処理される for ループの前の配列キャプチャ
Issue: KT-21354
Component: Kotlin/JVM
Incompatible change type: Source
Short summary: for ループ範囲の式がループ本体で更新されるローカル変数の場合、この変更はループの実行に影響を与えます。これは、範囲、文字列、コレクションなどの他のコンテナの反復処理と一致しません。
Deprecation cycle:
- <1.2: 記述されたコードパターンは正常にコンパイルされますが、ローカル変数への更新はループの実行に影響を与えます
- 1.2.X: for ループの範囲式が、ループ本体で代入される配列型のローカル変数の場合、非推奨の警告が報告されます
- 1.3: そのような場合の動作を、他のコンテナと一貫性があるように変更します
enum エントリのネストされた classifiers
Issue: KT-16310
Component: Core language
Incompatible change type: Source
Short summary: Kotlin 1.3以降、enum エントリのネストされた classifiers (クラス、オブジェクト、インターフェース、アノテーションクラス、enum クラス) は禁止されています
Deprecation cycle:
- <1.2: enum エントリのネストされた classifiers は正常にコンパイルされますが、実行時に例外が発生する可能性があります
- 1.2.X: ネストされた classifiers で非推奨の警告が報告されます
- >=1.3: 非推奨の警告はエラーに昇格します
データクラスの copy のオーバーライド
Issue: KT-19618
Components: Core language
Incompatible change type: Source
Short summary: Kotlin 1.3以降、データクラスは
copy()
をオーバーライドすることが禁止されていますDeprecation cycle:
- <1.2:
copy()
をオーバーライドするデータクラスは正常にコンパイルされますが、実行時に失敗したり、奇妙な動作を示す可能性があります- 1.2.X:
copy()
をオーバーライドするデータクラスで非推奨の警告が報告されます- >=1.3: 非推奨の警告はエラーに昇格します
外側のクラスからジェネリックパラメータをキャプチャする Throwable を継承する内部クラス
Issue: KT-17981
Component: Core language
Incompatible change type: Source
Short summary: Kotlin 1.3以降、内部クラスは
Throwable
を継承することは許可されていませんDeprecation cycle:
- <1.2:
Throwable
を継承する内部クラスは正常にコンパイルされます。そのような内部クラスがジェネリックパラメータをキャプチャする場合、実行時に失敗する奇妙なコードパターンにつながる可能性があります。- 1.2.X:
Throwable
を継承する内部クラスで非推奨の警告が報告されます- >=1.3: 非推奨の警告はエラーに昇格します
コンパニオンオブジェクトを含む複雑なクラス階層に関する可視性ルール
Component: Core language
Incompatible change type: Source
Short summary: Kotlin 1.3以降、コンパニオンオブジェクトとネストされた classifiers を含む複雑なクラス階層の場合、短い名前による可視性のルールはより厳密になります。
Deprecation cycle:
- <1.2: 古い可視性ルール (詳細はIssueを参照)
- 1.2.X: アクセスできなくなる短い名前で非推奨の警告が報告されます。ツールは、完全な名前を追加することで自動移行を提案します。
- >=1.3: 非推奨の警告はエラーに昇格します。問題のあるコードは、完全な修飾子または明示的なインポートを追加する必要があります
非定数の vararg アノテーションパラメータ
Issue: KT-23153
Component: Core language
Incompatible change type: Source
Short summary: Kotlin 1.3以降、非定数値を vararg アノテーションパラメータとして設定することは禁止されています
Deprecation cycle:
- <1.2: コンパイラは、vararg アノテーションパラメータに非定数値を渡すことを許可していますが、実際にはバイトコード生成中にその値をドロップし、不明確な動作につながります
- 1.2.X: そのようなコードパターンで非推奨の警告が報告されます
- >=1.3: 非推奨の警告はエラーに昇格します
ローカルアノテーションクラス
Issue: KT-23277
Component: Core language
Incompatible change type: Source
Short summary: Kotlin 1.3以降、ローカルアノテーションクラスはサポートされていません
Deprecation cycle:
- <1.2: コンパイラはローカルアノテーションクラスを正常にコンパイルしました
- 1.2.X: ローカルアノテーションクラスで非推奨の警告が報告されます
- >=1.3: 非推奨の警告はエラーに昇格します
ローカル delegated プロパティのスマートキャスト
Issue: KT-22517
Component: Core language
Incompatible change type: Source
Short summary: Kotlin 1.3以降、ローカル delegated プロパティのスマートキャストは許可されていません
Deprecation cycle:
- <1.2: コンパイラはローカル delegated プロパティをスマートキャストすることを許可していましたが、不正な delegate の場合、不健全なスマートキャストにつながる可能性がありました
- 1.2.X: ローカル delegated プロパティのスマートキャストは非推奨として報告されます (コンパイラは警告を発行します)
- >=1.3: 非推奨の警告はエラーに昇格します
mod 演算子の規約
Issues: KT-24197
Component: Core language
Incompatible change type: Source
Short summary: Kotlin 1.3以降、
mod
演算子の宣言、およびそのような宣言に解決される呼び出しは禁止されていますDeprecation cycle:
- 1.1.X, 1.2.X:
operator mod
の宣言、およびそれに解決される呼び出しで警告を報告します- 1.3.X: 警告をエラーに昇格させますが、
operator mod
宣言への解決は引き続き許可します- 1.4.X:
operator mod
への呼び出しはもう解決しません
名前付き形式での vararg への単一要素の渡し
Issues: KT-20588, KT-20589. See also KT-20171
Component: Core language
Incompatible change type: Source
Short summary: Kotlin 1.3では、vararg への単一要素の代入は非推奨となり、連続する spread と配列構築に置き換える必要があります。
Deprecation cycle:
- <1.2: 名前付き形式で vararg に1つの値を代入すると、正常にコンパイルされ、配列への 単一 要素の代入として扱われ、vararg に配列を代入するときに不明確な動作が発生します
- 1.2.X: そのような代入で非推奨の警告が報告され、連続する spread と配列構築に切り替えるように推奨されます
- 1.3.X: 警告はエラーに昇格します
- >= 1.4: vararg への単一要素の代入のセマンティクスを変更し、配列の代入を配列の spread の代入と同等にします
ターゲット EXPRESSION を持つアノテーションの保持
Issue: KT-13762
Component: Core language
Incompatible change type: Source
Short summary: Kotlin 1.3以降、ターゲット
EXPRESSION
を持つアノテーションでは、SOURCE
保持のみが許可されますDeprecation cycle:
- <1.2: ターゲット
EXPRESSION
とSOURCE
以外の保持を持つアノテーションは許可されていますが、使用箇所では暗黙的に無視されます- 1.2.X: そのようなアノテーションの宣言で非推奨の警告が報告されます
- >=1.3: 警告はエラーに昇格します
ターゲット PARAMETER を持つアノテーションは、パラメータの型に適用可能であってはなりません
Issue: KT-9580
Component: Core language
Incompatible change type: Source
Short summary: Kotlin 1.3以降、ターゲット
PARAMETER
を持つアノテーションがパラメータの型に適用される場合、間違ったアノテーションターゲットに関するエラーが正しく報告されますDeprecation cycle:
- <1.2: 前述のコードパターンは正常にコンパイルされます。アノテーションは暗黙的に無視され、バイトコードには存在しません
- 1.2.X: そのような使用法で非推奨の警告が報告されます
- >=1.3: 警告はエラーに昇格します
Array.copyOfRange は、返される配列を拡大する代わりに、インデックスが範囲外の場合に例外をスローします
Issue: KT-19489
Component: kotlin-stdlib (JVM)
Incompatible change type: Behavioral
Short summary: Kotlin 1.3以降、コピーされる範囲の排他的な末尾を表す
Array.copyOfRange
のtoIndex
引数が配列サイズを超えていないことを確認し、超えている場合はIllegalArgumentException
をスローします。Deprecation cycle:
- <1.3:
Array.copyOfRange
の呼び出しでtoIndex
が配列サイズよりも大きい場合、範囲内の不足している要素はnull
で埋められ、Kotlin 型システムの健全性が損なわれます。- >=1.3:
toIndex
が配列の範囲内にあることを確認し、そうでない場合は例外をスローします
Int.MIN_VALUE および Long.MIN_VALUE のステップを持つ int および long の Progression は禁止されており、インスタンス化することはできません
Issue: KT-17176
Component: kotlin-stdlib (JVM)
Incompatible change type: Behavioral
Short summary: Kotlin 1.3以降、整数 Progression のステップ値が、その整数型の最小負の値 (
Long
またはInt
) であることを禁止します。そのため、IntProgression.fromClosedRange(0, 1, step = Int.MIN_VALUE)
を呼び出すとIllegalArgumentException
がスローされます。Deprecation cycle:
- <1.3:
Int.MIN_VALUE
ステップでIntProgression
を作成することができ、2つの値[0, -2147483648]
が生成されます。これは不明確な動作です- >=1.3: ステップがその整数型の最小負の値である場合、
IllegalArgumentException
をスローします
非常に長いシーケンスに対する操作でのインデックスオーバーフローのチェック
Issue: KT-16097
Component: kotlin-stdlib (JVM)
Incompatible change type: Behavioral
Short summary: Kotlin 1.3以降、
index
、count
などのメソッドが長いシーケンスでオーバーフローしないようにします。影響を受けるメソッドの完全なリストについては、Issueを参照してください。Deprecation cycle:
- <1.3: 非常に長いシーケンスでそのようなメソッドを呼び出すと、整数のオーバーフローにより負の結果が生成される可能性があります
- >=1.3: そのようなメソッドでオーバーフローを検出し、すぐに例外をスローします
プラットフォーム間で空の一致 regex 結果による分割を統一します
Issue: KT-21049
Component: kotlin-stdlib (JVM)
Incompatible change type: Behavioral
Short summary: Kotlin 1.3以降、すべてのプラットフォームで空の一致 regex による
split
メソッドの動作を統一しますDeprecation cycle:
- <1.3: 記述された呼び出しの動作は、JS、JRE 6、JRE 7 と JRE 8+ を比較すると異なります
- >=1.3: プラットフォーム間で動作を統一します
コンパイラディストリビューションで非推奨になった成果物を廃止しました
Issue: KT-23799
Component: other
Incompatible change type: Binary
Short summary: Kotlin 1.3では、次の非推奨のバイナリ成果物を廃止します。
kotlin-runtime
: 代わりにkotlin-stdlib
を使用しますkotlin-stdlib-jre7/8
: 代わりにkotlin-stdlib-jdk7/8
を使用します- コンパイラディストリビューションの
kotlin-jslib
: 代わりにkotlin-stdlib-js
を使用しますDeprecation cycle:
- 1.2.X: 成果物は非推奨としてマークされ、コンパイラはそれらの成果物の使用に関する警告を報告しました
- >=1.3: 成果物は廃止されました
stdlib のアノテーション
Issue: KT-21784
Component: kotlin-stdlib (JVM)
Incompatible change type: Binary
Short summary: Kotlin 1.3では、
org.jetbrains.annotations
パッケージのアノテーションを stdlib から削除し、コンパイラとともに配布される個別の成果物 (annotations-13.0.jar
およびmutability-annotations-compat.jar
) に移動しますDeprecation cycle:
- <1.3: アノテーションは stdlib 成果物とともに配布されました
- >=1.3: アノテーションは個別の成果物で配布されます