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