Kotlin 1.4 互換性ガイド
言語を最新に保つ と 快適なアップデート は、Kotlin言語設計における基本的な原則です。前者は言語の進化を妨げる構文は削除されるべきであり、後者はコードの移行をできるだけスムーズにするために、この削除が事前に十分に伝えられるべきであると述べています。
言語の変更のほとんどは、アップデートの変更ログやコンパイラの警告など、他のチャネルを通じてすでに発表されていますが、このドキュメントはそれらすべてをまとめ、Kotlin 1.3からKotlin 1.4への移行に関する完全なリファレンスを提供します。
基本的な用語
このドキュメントでは、いくつかの種類の互換性について説明します。
- ソース: ソース非互換の変更は、以前は問題なく(エラーや警告なしに)コンパイルできていたコードがコンパイルできなくなる変更です。
- バイナリ: 2つのバイナリ成果物は、それらを交換しても読み込みまたはリンクエラーが発生しない場合に、バイナリ互換であると言われます。
- 動作: 変更適用前後で同じプログラムが異なる動作を示す場合、その変更は動作非互換であると言われます。
これらの定義は純粋なKotlinのみに適用されることに注意してください。他の言語の視点(例えばJavaから)でのKotlinコードの互換性については、このドキュメントの範囲外です。
言語と標準ライブラリ
中置演算子とConcurrentHashMap
での予期せぬ動作
Issue: KT-18053
コンポーネント: コア言語
非互換変更の種類: ソース
概要: Kotlin 1.4では、Javaで記述された
java.util.Map
の実装者から来る自動演算子contains
が禁止されます。非推奨サイクル:
- < 1.4: 呼び出し箇所での問題のある演算子に対して警告を導入
= 1.4: この警告をエラーに昇格。
-XXLanguage:-ProhibitConcurrentHashMapContains
を使用して一時的に1.4以前の動作に戻すことができます。
public
inline
メンバー内でのprotected
メンバーへのアクセスを禁止
Issue: KT-21178
コンポーネント: コア言語
非互換変更の種類: ソース
概要: Kotlin 1.4では、
public
inline
メンバーからのprotected
メンバーへのアクセスが禁止されます。非推奨サイクル:
- < 1.4: 問題のあるケースについて呼び出し箇所で警告を導入
- 1.4: この警告をエラーに昇格。
-XXLanguage:-ProhibitProtectedCallFromInline
を使用して一時的に1.4以前の動作に戻すことができます。
暗黙的なレシーバを持つ呼び出しにおけるコントラクト
Issue: KT-28672
コンポーネント: コア言語
非互換変更の種類: 動作
概要: Kotlin 1.4では、コントラクトからのスマートキャストが暗黙的なレシーバを持つ呼び出しで利用可能になります。
非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました。
-XXLanguage:-ContractsOnCallsWithImplicitReceiver
を使用して一時的に1.4以前の動作に戻すことができます。
浮動小数点数比較の一貫性のない動作
Issues: KT-22723
コンポーネント: コア言語
非互換変更の種類: 動作
概要: Kotlin 1.4以降、Kotlinコンパイラは浮動小数点数の比較にIEEE 754標準を使用します。
非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました。
-XXLanguage:-ProperIeee754Comparisons
を使用して一時的に1.4以前の動作に戻すことができます。
ジェネリックラムダ内の最後の式におけるスマートキャストなし
Issue: KT-15020
コンポーネント: コア言語
非互換変更の種類: 動作
概要: Kotlin 1.4以降、ラムダ内の最後の式に対するスマートキャストが正しく適用されます。
非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました。
-XXLanguage:-NewInference
を使用して一時的に1.4以前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
Unit
への結果の強制のためにラムダ引数の順序に依存しない
Issue: KT-36045
コンポーネント: コア言語
非互換変更の種類: ソース
概要: Kotlin 1.4以降、ラムダ引数は
Unit
への暗黙的な強制なしに独立して解決されます。非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました。
-XXLanguage:-NewInference
を使用して一時的に1.4以前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
raw型と整数リテラル型間の誤った共通上位型が不正なコードを引き起こす
Issue: KT-35681
コンポーネント: コア言語
非互換変更の種類: ソース
概要: Kotlin 1.4以降、rawな
Comparable
型と整数リテラル型間の共通上位型がより具体的になります。非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました。
-XXLanguage:-NewInference
を使用して一時的に1.4以前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
同じ型変数が異なる型でインスタンス化されることによる型安全性の問題
Issue: KT-35679
コンポーネント: コア言語
非互換変更の種類: ソース
概要: Kotlin 1.4以降、Kotlinコンパイラは同じ型変数を異なる型でインスタンス化することを禁止します。
非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました。
-XXLanguage:-NewInference
を使用して一時的に1.4以前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
交差型に対する不正確なサブタイピングによる型安全性の問題
Issues: KT-22474
コンポーネント: コア言語
非互換変更の種類: ソース
概要: Kotlin 1.4では、交差型に対するサブタイピングがより正確に動作するように洗練されます。
非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました。
-XXLanguage:-NewInference
を使用して一時的に1.4以前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
ラムダ内の空のwhen
式での型不一致なし
Issue: KT-17995
コンポーネント: コア言語
非互換変更の種類: ソース
概要: Kotlin 1.4以降、空の
when
式がラムダ内の最後の式として使用された場合、型不一致が発生するようになります。非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました。
-XXLanguage:-NewInference
を使用して一時的に1.4以前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
可能な戻り値のいずれかに整数リテラルを持つ早期リターンがあるラムダでAny
型が推論される
Issue: KT-20226
コンポーネント: コア言語
非互換変更の種類: ソース
概要: Kotlin 1.4以降、ラムダから返される整数型は、早期リターンがあるケースでより具体的になります。
非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました。
-XXLanguage:-NewInference
を使用して一時的に1.4以前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
再帰型を持つスタープロジェクションの適切なキャプチャ
Issue: KT-33012
コンポーネント: コア言語
非互換変更の種類: ソース
概要: Kotlin 1.4以降、再帰型のキャプチャがより正確に動作するため、より多くの候補が適用可能になります。
非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました。
-XXLanguage:-NewInference
を使用して一時的に1.4以前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
非適切な型とフレキシブル型での共通上位型計算が不正な結果を引き起こす
Issue: KT-37054
コンポーネント: コア言語
非互換変更の種類: 動作
概要: Kotlin 1.4以降、フレキシブル型間の共通上位型がより具体的になり、ランタイムエラーから保護されます。
非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました。
-XXLanguage:-NewInference
を使用して一時的に1.4以前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
Nullableな型引数に対するキャプチャされた変換の不足による型安全性の問題
Issue: KT-35487
コンポーネント: コア言語
非互換変更の種類: ソース
概要: Kotlin 1.4以降、キャプチャされた型とNullableな型間のサブタイピングがより正確になり、ランタイムエラーから保護されます。
非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました。
-XXLanguage:-NewInference
を使用して一時的に1.4以前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
非チェックキャスト後の共変型に対する交差型の保持
Issue: KT-37280
コンポーネント: コア言語
非互換変更の種類: ソース
概要: Kotlin 1.4以降、共変型の非チェックキャストは、非チェックキャストの型ではなく、スマートキャストの交差型を生成します。
非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました。
-XXLanguage:-NewInference
を使用して一時的に1.4以前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
this
式の使用によるビルダー推論からの型変数リーク
Issue: KT-32126
コンポーネント: コア言語
非互換変更の種類: ソース
概要: Kotlin 1.4以降、
sequence {}
のようなビルダー関数内でthis
を使用することは、他の適切な制約がない場合に禁止されます。非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました。
-XXLanguage:-NewInference
を使用して一時的に1.4以前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
Nullableな型引数を持つ反変型に対する誤ったオーバーロード解決
Issue: KT-31670
コンポーネント: コア言語
非互換変更の種類: ソース
概要: Kotlin 1.4以降、反変型引数を取る関数の2つのオーバーロードが、型(
In<T>
とIn<T?>
など)のnullabilityのみで異なる場合、Nullableな型がより具体的であると見なされます。非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました。
-XXLanguage:-NewInference
を使用して一時的に1.4以前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
非ネストの再帰制約を持つビルダー推論
Issue: KT-34975
コンポーネント: コア言語
非互換変更の種類: ソース
概要: Kotlin 1.4以降、渡されたラムダ内の再帰制約に依存する型を持つ
sequence {}
のようなビルダー関数は、コンパイラエラーを引き起こします。非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました。
-XXLanguage:-NewInference
を使用して一時的に1.4以前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
積極的な型変数固定が矛盾する制約システムを引き起こす
Issue: KT-25175
コンポーネント: コア言語
非互換変更の種類: ソース
概要: Kotlin 1.4以降、型推論は特定のケースでより控えめに動作し、矛盾しない制約システムを見つけることが可能になります。
非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました。
-XXLanguage:-NewInference
を使用して一時的に1.4以前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
open
関数におけるtailrec
修飾子の禁止
Issue: KT-18541
コンポーネント: コア言語
非互換変更の種類: ソース
概要: Kotlin 1.4以降、関数は
open
とtailrec
修飾子を同時に持つことができません。非推奨サイクル:
- < 1.4:
open
とtailrec
修飾子を同時に持つ関数について警告を報告します(プログレッシブモードではエラー)。= 1.4: この警告をエラーに昇格します。
コンパニオンオブジェクトのINSTANCE
フィールドがコンパニオンオブジェクトクラス自体よりも可視性が高い
Issue: KT-11567
コンポーネント: Kotlin/JVM
非互換変更の種類: ソース
概要: Kotlin 1.4以降、コンパニオンオブジェクトが
private
な場合、そのINSTANCE
フィールドもprivate
になります。非推奨サイクル:
- < 1.4: コンパイラは
INSTANCE
オブジェクトを非推奨フラグ付きで生成します。= 1.4: コンパニオンオブジェクトの
INSTANCE
フィールドが適切な可視性を持つようになります。
return
の前に挿入された外側のfinally
ブロックが、finally
のない内側のtry
ブロックのcatch
インターバルから除外されない
Issue: KT-31923
コンポーネント: Kotlin/JVM
非互換変更の種類: 動作
概要: Kotlin 1.4以降、ネストされた
try/catch
ブロックに対してcatch
インターバルが適切に計算されます。非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました。
-XXLanguage:-ProperFinally
を使用して一時的に1.4以前の動作に戻すことができます。
共変型およびジェネリック特化されたオーバーライドの戻り値の型位置で、インラインクラスのボックス化されたバージョンを使用する
Issues: KT-30419
コンポーネント: Kotlin/JVM
非互換変更の種類: 動作
概要: Kotlin 1.4以降、共変型およびジェネリック特化されたオーバーライドを使用する関数は、インラインクラスのボックス化された値を返します。
非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました
Kotlinインターフェースへの委譲を使用する際に、JVMバイトコードでチェック済み例外を宣言しない
Issue: KT-35834
コンポーネント: Kotlin/JVM
非互換変更の種類: ソース
概要: Kotlin 1.4では、Kotlinインターフェースへのインターフェース委譲時にチェック済み例外が生成されなくなります。
非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました。
-XXLanguage:-DoNotGenerateThrowsForDelegatedKotlinMembers
を使用して一時的に1.4以前の動作に戻すことができます。
単一のvararg
パラメータを持つメソッドへのシグネチャ多相呼び出しの動作変更:引数を別の配列にラップすることを避ける
Issue: KT-35469
コンポーネント: Kotlin/JVM
非互換変更の種類: ソース
概要: Kotlin 1.4では、シグネチャ多相呼び出しにおいて引数を別の配列にラップしなくなります。
非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました
KClass
がジェネリックパラメータとして使用される場合のアノテーションにおける不正確なジェネリックシグネチャ
Issue: KT-35207
コンポーネント: Kotlin/JVM
非互換変更の種類: ソース
概要: Kotlin 1.4では、
KClass
がジェネリックパラメータとして使用される場合のアノテーションにおける不正確な型マッピングが修正されます。非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました
シグネチャ多相呼び出しにおけるスプレッド演算子の禁止
Issue: KT-35226
コンポーネント: Kotlin/JVM
非互換変更の種類: ソース
概要: Kotlin 1.4では、シグネチャ多相呼び出しにおけるスプレッド演算子(
*
)の使用が禁止されます。非推奨サイクル:
- < 1.4: シグネチャ多相呼び出しにおけるスプレッド演算子の使用について警告を報告します。
= 1.5: この警告をエラーに昇格します。
-XXLanguage:-ProhibitSpreadOnSignaturePolymorphicCall
を使用して一時的に1.4以前の動作に戻すことができます。
末尾再帰最適化された関数のデフォルト値の初期化順序を変更
Issue: KT-31540
コンポーネント: Kotlin/JVM
非互換変更の種類: 動作
概要: Kotlin 1.4以降、末尾再帰関数の初期化順序は通常の関数と同じになります。
非推奨サイクル:
- < 1.4: 問題のある関数について宣言サイトで警告を報告します。
= 1.4: 動作が変更されました。
-XXLanguage:-ProperComputationOrderOfTailrecDefaultParameters
を使用して一時的に1.4以前の動作に戻すことができます。
const
でないval
に対してConstantValue
属性を生成しない
Issue: KT-16615
コンポーネント: Kotlin/JVM
非互換変更の種類: 動作
概要: Kotlin 1.4以降、コンパイラは
const
でないval
に対してConstantValue
属性を生成しなくなります。非推奨サイクル:
- < 1.4: IntelliJ IDEAのインスペクションを通じて警告を報告します。
= 1.4: 動作が変更されました。
-XXLanguage:-NoConstantValueAttributeForNonConstVals
を使用して一時的に1.4以前の動作に戻すことができます。
open
メソッドの@JvmOverloads
に対する生成されたオーバーロードはfinal
であるべき
Issue: KT-33240
コンポーネント: Kotlin/JVM
非互換変更の種類: ソース
概要:
@JvmOverloads
を持つ関数のオーバーロードはfinal
として生成されます。非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました。
-XXLanguage:-GenerateJvmOverloadsAsFinal
を使用して一時的に1.4以前の動作に戻すことができます。
kotlin.Result
を返すラムダは、非ボックス化された値の代わりにボックス化された値を返すようになりました
Issue: KT-39198
コンポーネント: Kotlin/JVM
非互換変更の種類: 動作
概要: Kotlin 1.4以降、
kotlin.Result
型の値を返すラムダは、非ボックス化された値の代わりにボックス化された値を返すようになります。非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました
nullチェックからの例外を統一
Issue: KT-22275
コンポーネント: Kotlin/JVM
非互換変更の種類: 動作
概要: Kotlin 1.4以降、すべての実行時nullチェックは
java.lang.NullPointerException
をスローするようになります。非推奨サイクル:
- < 1.4: 実行時nullチェックは、
KotlinNullPointerException
、IllegalStateException
、IllegalArgumentException
、TypeCastException
などの異なる例外をスローします。= 1.4: すべての実行時nullチェックは
java.lang.NullPointerException
をスローします。-Xno-unified-null-checks
を使用して一時的に1.4以前の動作に戻すことができます。
配列/リスト操作のcontains
、indexOf
、lastIndexOf
における浮動小数点値の比較:IEEE 754または全順序
Issue: KT-28753
コンポーネント: kotlin-stdlib (JVM)
非互換変更の種類: 動作
概要:
Double/FloatArray.asList()
から返されるList
の実装は、contains
、indexOf
、lastIndexOf
を実装し、それらが全順序等価性を使用するようになります。非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました
コレクションのmin
およびmax
関数の戻り値の型を段階的に非Nullableに変更
Issue: KT-38854
コンポーネント: kotlin-stdlib (JVM)
非互換変更の種類: ソース
概要: コレクションの
min
およびmax
関数の戻り値の型は、1.6で非Nullableに変更されます。非推奨サイクル:
- 1.4:
...OrNull
関数を同義語として導入し、影響を受けるAPIを非推奨にします(課題の詳細を参照)。- 1.5.x: 影響を受けるAPIの非推奨レベルをエラーに昇格します。
=1.6: 影響を受けるAPIを非Nullableな戻り値の型で再導入します。
appendLine
を推奨しappendln
を非推奨化
Issue: KT-38754
コンポーネント: kotlin-stdlib (JVM)
非互換変更の種類: ソース
概要:
StringBuilder.appendln()
はStringBuilder.appendLine()
を推奨して非推奨化されます。非推奨サイクル:
- 1.4:
appendln
の代替としてappendLine
関数を導入し、appendln
を非推奨にします。=1.5: 非推奨レベルをエラーに昇格します。
浮動小数点型からShort
およびByte
への変換を非推奨化
Issue: KT-30360
コンポーネント: kotlin-stdlib (JVM)
非互換変更の種類: ソース
概要: Kotlin 1.4以降、浮動小数点型から
Short
およびByte
への変換が非推奨化されます。非推奨サイクル:
- 1.4:
Double.toShort()/toByte()
およびFloat.toShort()/toByte()
を非推奨にし、代替を提案します。=1.5: 非推奨レベルをエラーに昇格します。
無効なstartIndex
に対するRegex.findAll
での早期失敗
Issue: KT-28356
コンポーネント: kotlin-stdlib
非互換変更の種類: 動作
概要: Kotlin 1.4以降、
findAll
は、findAll
に入った時点でstartIndex
が入力文字シーケンスの有効な位置インデックスの範囲内にあることをチェックするように改善され、そうでない場合はIndexOutOfBoundsException
をスローします。非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました
非推奨のkotlin.coroutines.experimental
を削除
Issue: KT-36083
コンポーネント: kotlin-stdlib
非互換変更の種類: ソース
概要: Kotlin 1.4以降、非推奨の
kotlin.coroutines.experimental
APIが標準ライブラリから削除されます。非推奨サイクル:
- < 1.4:
kotlin.coroutines.experimental
はERROR
レベルで非推奨化されています。= 1.4:
kotlin.coroutines.experimental
は標準ライブラリから削除されます。JVMでは、個別の互換性アーティファクトが提供されます(課題の詳細を参照)。
非推奨のmod
演算子を削除
Issue: KT-26654
コンポーネント: kotlin-stdlib
非互換変更の種類: ソース
概要: Kotlin 1.4以降、数値型に対する
mod
演算子が標準ライブラリから削除されます。非推奨サイクル:
- < 1.4:
mod
はERROR
レベルで非推奨化されています。= 1.4:
mod
は標準ライブラリから削除されます。
Throwable.addSuppressed
メンバーを非表示にし、代わりに拡張を推奨
Issue: KT-38777
コンポーネント: kotlin-stdlib
非互換変更の種類: 動作
概要:
Throwable.addSuppressed()
拡張関数は、Throwable.addSuppressed()
メンバー関数よりも優先されるようになりました。非推奨サイクル:
- < 1.4: 古い動作(課題の詳細を参照)
= 1.4: 動作が変更されました
capitalize
は二重音字をタイトルケースに変換すべき
Issue: KT-38817
コンポーネント: kotlin-stdlib
非互換変更の種類: 動作
概要:
String.capitalize()
関数は、セルボ・クロアチア語のガイのラテン文字からの二重音字をタイトルケース(DŽ
ではなくDž
)で大文字化するようになりました。非推奨サイクル:
- < 1.4: 二重音字は大文字(
DŽ
)で大文字化されます。= 1.4: 二重音字はタイトルケース(
Dž
)で大文字化されます。
ツール
区切り文字を含むコンパイラ引数はWindowsで二重引用符で渡す必要がある
Issue: KT-41309
コンポーネント: CLI
非互換変更の種類: 動作
概要: Windowsでは、区切り文字(空白、
=
、;
、,
)を含むkotlinc.bat
引数は、二重引用符("
)を必要とするようになりました。非推奨サイクル:
- < 1.4: すべてのコンパイラ引数は引用符なしで渡されます。
= 1.4: 区切り文字(空白、
=
、;
、,
)を含むコンパイラ引数は、二重引用符("
)を必要とします。
KAPT: プロパティに対する合成$annotations()
メソッドの名前が変更されました
Issue: KT-36926
コンポーネント: KAPT
非互換変更の種類: 動作
概要: Kotlin 1.4で、KAPTによって生成されるプロパティに対する合成
$annotations()
メソッドの名前が変更されました。非推奨サイクル:
- < 1.4: プロパティに対する合成
$annotations()
メソッドの名前は、<propertyName>@annotations()
のテンプレートに従います。= 1.4: プロパティに対する合成
$annotations()
メソッドの名前は、get
プレフィックスを含むようになります:get<PropertyName>@annotations()
。