Skip to content

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以降、関数はopentailrec修飾子を同時に持つことができません。

非推奨サイクル:

  • < 1.4: opentailrec修飾子を同時に持つ関数について警告を報告します(プログレッシブモードではエラー)。
  • = 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チェックは、KotlinNullPointerExceptionIllegalStateExceptionIllegalArgumentExceptionTypeCastExceptionなどの異なる例外をスローします。
  • = 1.4: すべての実行時nullチェックはjava.lang.NullPointerExceptionをスローします。 -Xno-unified-null-checks を使用して一時的に1.4以前の動作に戻すことができます。

配列/リスト操作のcontainsindexOflastIndexOfにおける浮動小数点値の比較:IEEE 754または全順序

Issue: KT-28753

コンポーネント: kotlin-stdlib (JVM)

非互換変更の種類: 動作

概要: Double/FloatArray.asList()から返されるListの実装は、containsindexOflastIndexOfを実装し、それらが全順序等価性を使用するようになります。

非推奨サイクル:

  • < 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.experimentalERRORレベルで非推奨化されています。
  • = 1.4: kotlin.coroutines.experimentalは標準ライブラリから削除されます。JVMでは、個別の互換性アーティファクトが提供されます(課題の詳細を参照)。

非推奨のmod演算子を削除

Issue: KT-26654

コンポーネント: kotlin-stdlib

非互換変更の種類: ソース

概要: Kotlin 1.4以降、数値型に対するmod演算子が標準ライブラリから削除されます。

非推奨サイクル:

  • < 1.4: modERRORレベルで非推奨化されています。
  • = 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()