Kotlin 1.4 互換性ガイド
言語の現代性を保つ および 快適なアップデート は、Kotlin言語設計における基本的な原則です。前者は、言語の進化を妨げる構文を削除すべきであると述べ、後者は、コード移行を可能な限りスムーズにするために、この削除が事前に十分に伝達されるべきであると述べています。
ほとんどの言語変更は、更新履歴やコンパイラ警告などの他のチャネルを通じて既に発表されていますが、このドキュメントではそれらすべてをまとめ、Kotlin 1.3 から Kotlin 1.4 への移行に関する完全なリファレンスを提供します。
基本的な用語
このドキュメントでは、いくつかの種類の互換性について説明します。
- source: ソース互換性のない変更により、以前は(エラーや警告なしで)正常にコンパイルできていたコードが、コンパイルできなくなります。
- binary: 2つのバイナリアーティファクトは、それらを相互に入れ替えてもロードエラーやリンクエラーを引き起こさない場合、バイナリ互換性があると言われます。
- behavioral: 変更適用前後で同じプログラムが異なる振る舞いを示す場合、その変更は動作互換性のない変更であると言われます。
これらの定義は純粋なKotlinに対してのみ与えられていることを覚えておいてください。他の言語(例えばJava)の視点から見たKotlinコードの互換性は、このドキュメントの範囲外です。
言語と標準ライブラリ
in
演算子と 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
コンポーネント: コア言語
互換性のない変更の種類: 動作
概要: 1.4 では、コントラクトからのスマートキャストが暗黙的なレシーバーを持つ呼び出しで利用可能になります。
非推奨サイクル:
- < 1.4: 従来の動作(詳細はIssueを参照)
= 1.4: 動作変更
-XXLanguage:-ContractsOnCallsWithImplicitReceiver
を使用して一時的に1.4より前の動作に戻すことができます。
浮動小数点数比較の一貫性のない動作
Issues: KT-22723
コンポーネント: コア言語
互換性のない変更の種類: 動作
概要: Kotlin 1.4 以降、Kotlin コンパイラは浮動小数点数の比較に IEEE 754 標準を使用します。
非推奨サイクル:
- < 1.4: 従来の動作(詳細はIssueを参照)
= 1.4: 動作変更
-XXLanguage:-ProperIeee754Comparisons
を使用して一時的に1.4より前の動作に戻すことができます。
ジェネリックラムダの最後の式におけるスマートキャストなし
Issue: KT-15020
コンポーネント: コア言語
互換性のない変更の種類: 動作
概要: 1.4 以降、ラムダ内の最後の式に対するスマートキャストが正しく適用されます。
非推奨サイクル:
- < 1.4: 従来の動作(詳細はIssueを参照)
= 1.4: 動作変更
-XXLanguage:-NewInference
を使用して一時的に1.4より前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
ラムダ引数の順序に依存して結果を Unit
に強制しない
Issue: KT-36045
コンポーネント: コア言語
互換性のない変更の種類: ソース
概要: Kotlin 1.4 以降、ラムダ引数は
Unit
への暗黙的な強制なしに独立して解決されます。非推奨サイクル:
- < 1.4: 従来の動作(詳細はIssueを参照)
= 1.4: 動作変更
-XXLanguage:-NewInference
を使用して一時的に1.4より前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
raw型と整数リテラル型間の誤った共通スーパータイプが不健全なコードにつながる
Issue: KT-35681
コンポーネント: コア言語
互換性のない変更の種類: ソース
概要: Kotlin 1.4 以降、rawな
Comparable
型と整数リテラル型間の共通スーパータイプがより特定されます。非推奨サイクル:
- < 1.4: 従来の動作(詳細はIssueを参照)
= 1.4: 動作変更
-XXLanguage:-NewInference
を使用して一時的に1.4より前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
複数の等しい型変数が異なる型でインスタンス化されることによる型安全性の問題
Issue: KT-35679
コンポーネント: コア言語
互換性のない変更の種類: ソース
概要: Kotlin 1.4 以降、Kotlin コンパイラは等しい型変数を異なる型でインスタンス化することを禁止します。
非推奨サイクル:
- < 1.4: 従来の動作(詳細はIssueを参照)
= 1.4: 動作変更
-XXLanguage:-NewInference
を使用して一時的に1.4より前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
交差型に対する不正なサブタイピングによる型安全性の問題
Issues: KT-22474
コンポーネント: コア言語
互換性のない変更の種類: ソース
概要: Kotlin 1.4 では、交差型に対するサブタイピングがより正しく動作するように洗練されます。
非推奨サイクル:
- < 1.4: 従来の動作(詳細はIssueを参照)
= 1.4: 動作変更
-XXLanguage:-NewInference
を使用して一時的に1.4より前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
ラムダ内の空の when
式での型の不一致がない
Issue: KT-17995
コンポーネント: コア言語
互換性のない変更の種類: ソース
概要: Kotlin 1.4 以降、空の
when
式がラムダの最後の式として使用された場合、型の不一致が発生します。非推奨サイクル:
- < 1.4: 従来の動作(詳細はIssueを参照)
= 1.4: 動作変更
-XXLanguage:-NewInference
を使用して一時的に1.4より前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
複数の戻り値の可能性を持つラムダにおける早期リターンを伴う整数リテラルに対する Any
型推論
Issue: KT-20226
コンポーネント: コア言語
互換性のない変更の種類: ソース
概要: Kotlin 1.4 以降、早期リターンがある場合のラムダから返される整数型がより特定されます。
非推奨サイクル:
- < 1.4: 従来の動作(詳細はIssueを参照)
= 1.4: 動作変更
-XXLanguage:-NewInference
を使用して一時的に1.4より前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
再帰型を持つスタープロジェクションの適切なキャプチャ
Issue: KT-33012
コンポーネント: コア言語
互換性のない変更の種類: ソース
概要: Kotlin 1.4 以降、再帰型に対するキャプチャがより正しく動作するため、より多くの候補が適用可能になります。
非推奨サイクル:
- < 1.4: 従来の動作(詳細はIssueを参照)
= 1.4: 動作変更
-XXLanguage:-NewInference
を使用して一時的に1.4より前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
不適切な型と柔軟な型での共通スーパータイプ計算が誤った結果につながる
Issue: KT-37054
コンポーネント: コア言語
互換性のない変更の種類: 動作
概要: Kotlin 1.4 以降、柔軟な型間の共通スーパータイプがより特定され、ランタイムエラーから保護されます。
非推奨サイクル:
- < 1.4: 従来の動作(詳細はIssueを参照)
= 1.4: 動作変更
-XXLanguage:-NewInference
を使用して一時的に1.4より前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
Null許容型引数に対するキャプチャされた変換の不足による型安全性の問題
Issue: KT-35487
コンポーネント: コア言語
互換性のない変更の種類: ソース
概要: Kotlin 1.4 以降、キャプチャされた型とNull許容型の間のサブタイピングがより正しくなり、ランタイムエラーから保護されます。
非推奨サイクル:
- < 1.4: 従来の動作(詳細はIssueを参照)
= 1.4: 動作変更
-XXLanguage:-NewInference
を使用して一時的に1.4より前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
uncheckedキャスト後の共変型の交差型を保持する
Issue: KT-37280
コンポーネント: コア言語
互換性のない変更の種類: ソース
概要: Kotlin 1.4 以降、共変型の unchecked キャストは、スマートキャストに対して unchecked キャストの型ではなく、交差型を生成します。
非推奨サイクル:
- < 1.4: 従来の動作(詳細はIssueを参照)
= 1.4: 動作変更
-XXLanguage:-NewInference
を使用して一時的に1.4より前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
this
式の使用によるビルダ推論からの型変数リーク
Issue: KT-32126
コンポーネント: コア言語
互換性のない変更の種類: ソース
概要: Kotlin 1.4 以降、
sequence {}
のようなビルダ関数内でthis
を使用することは、他の適切な制約がない場合に禁止されます。非推奨サイクル:
- < 1.4: 従来の動作(詳細はIssueを参照)
= 1.4: 動作変更
-XXLanguage:-NewInference
を使用して一時的に1.4より前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
Null許容型引数を持つ反変型の誤ったオーバーロード解決
Issue: KT-31670
コンポーネント: コア言語
互換性のない変更の種類: ソース
概要: Kotlin 1.4 以降、反変型引数を取る関数の2つのオーバーロードが、型のNull許容性(例:
In<T>
とIn<T?>
)のみで異なる場合、Null許容型がより特定されるとみなされます。非推奨サイクル:
- < 1.4: 従来の動作(詳細はIssueを参照)
= 1.4: 動作変更
-XXLanguage:-NewInference
を使用して一時的に1.4より前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
ネストされていない再帰制約を持つビルダ推論
Issue: KT-34975
コンポーネント: コア言語
互換性のない変更の種類: ソース
概要: Kotlin 1.4 以降、渡されたラムダ内の再帰制約に依存する型を持つ
sequence {}
のようなビルダ関数は、コンパイラエラーを引き起こします。非推奨サイクル:
- < 1.4: 従来の動作(詳細はIssueを参照)
= 1.4: 動作変更
-XXLanguage:-NewInference
を使用して一時的に1.4より前の動作に戻すことができます。このフラグはいくつかの新しい言語機能も無効にする点に注意してください。
熱心な型変数固定が矛盾する制約システムにつながる
Issue: KT-25175
コンポーネント: コア言語
互換性のない変更の種類: ソース
概要: Kotlin 1.4 以降、特定のケースにおける型推論はより熱心に動作しなくなり、矛盾しない制約システムを見つけることができます。
非推奨サイクル:
- < 1.4: 従来の動作(詳細はIssueを参照)
= 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 以降、コンパニオンオブジェクトがプライベートの場合、その
INSTANCE
フィールドもプライベートになります。非推奨サイクル:
- < 1.4: コンパイラは非推奨フラグ付きで
INSTANCE
オブジェクトを生成します。= 1.4: コンパニオンオブジェクトの
INSTANCE
フィールドは適切な可視性を持ちます。
戻り値の前に挿入された外側の finally
ブロックが、finally
のない内側の try
ブロックの catch
区間から除外されない
Issue: KT-31923
コンポーネント: Kotlin/JVM
互換性のない変更の種類: 動作
概要: Kotlin 1.4 以降、ネストされた
try/catch
ブロックに対してcatch
区間が適切に計算されます。非推奨サイクル:
- < 1.4: 従来の動作(詳細はIssueを参照)
= 1.4: 動作変更
-XXLanguage:-ProperFinally
を使用して一時的に1.4より前の動作に戻すことができます。
共変およびジェネリックス特殊化されたオーバーライドの戻り値の型位置でインラインクラスのボックス化されたバージョンを使用する
Issues: KT-30419
コンポーネント: Kotlin/JVM
互換性のない変更の種類: 動作
概要: Kotlin 1.4 以降、共変およびジェネリックス特殊化されたオーバーライドを使用する関数は、インラインクラスのボックス化された値を返します。
非推奨サイクル:
- < 1.4: 従来の動作(詳細はIssueを参照)
= 1.4: 動作変更
Kotlinインターフェースへの委譲を使用する場合、JVMバイトコードでチェック済み例外を宣言しない
Issue: KT-35834
コンポーネント: Kotlin/JVM
互換性のない変更の種類: ソース
概要: Kotlin 1.4 では、Kotlinインターフェースへの委譲中にチェック済み例外を生成しません。
非推奨サイクル:
- < 1.4: 従来の動作(詳細はIssueを参照)
= 1.4: 動作変更
-XXLanguage:-DoNotGenerateThrowsForDelegatedKotlinMembers
を使用して一時的に1.4より前の動作に戻すことができます。
単一の vararg
パラメータを持つメソッドへのシグネチャポリモーフィック呼び出しの動作変更により、引数が別の配列にラップされるのを回避する
Issue: KT-35469
コンポーネント: Kotlin/JVM
互換性のない変更の種類: ソース
概要: Kotlin 1.4 では、シグネチャポリモーフィック呼び出しで引数を別の配列にラップしません。
非推奨サイクル:
- < 1.4: 従来の動作(詳細はIssueを参照)
= 1.4: 動作変更
KClass
がジェネリックパラメータとして使用される場合のアノテーションにおける不正なジェネリックシグネチャ
Issue: KT-35207
コンポーネント: Kotlin/JVM
互換性のない変更の種類: ソース
概要: Kotlin 1.4 では、
KClass
がジェネリックパラメータとして使用される場合のアノテーションにおける不正な型マッピングを修正します。非推奨サイクル:
- < 1.4: 従来の動作(詳細はIssueを参照)
= 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: 従来の動作(詳細はIssueを参照)
= 1.4: 動作変更
-XXLanguage:-GenerateJvmOverloadsAsFinal
を使用して一時的に1.4より前の動作に戻すことができます。
kotlin.Result
を返すラムダは、アンボックス化された値ではなくボックス化された値を返すようになる
Issue: KT-39198
コンポーネント: Kotlin/JVM
互換性のない変更の種類: 動作
概要: Kotlin 1.4 以降、
kotlin.Result
型の値を返すラムダは、アンボックス化された値ではなくボックス化された値を返します。非推奨サイクル:
- < 1.4: 従来の動作(詳細はIssueを参照)
= 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: 従来の動作(詳細はIssueを参照)
= 1.4: 動作変更
コレクションの min
および max
関数の戻り値の型を徐々に非nullableに変更する
Issue: KT-38854
コンポーネント:
kotlin-stdlib
(JVM)互換性のない変更の種類: ソース
概要: コレクションの
min
およびmax
関数の戻り値の型は 1.6 で非nullableに変更されます。非推奨サイクル:
- 1.4: 同義語として
...OrNull
関数を導入し、影響を受けるAPIを非推奨にする(詳細はIssueを参照)- 1.5.x: 影響を受けるAPIの非推奨レベルをエラーに昇格
=1.6: 影響を受けるAPIを非nullableな戻り値の型で再導入
appendln
を非推奨にし、appendLine
を推奨する
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
はstartIndex
がfindAll
に入る時点で入力文字シーケンスの有効な位置インデックスの範囲内にあることを確認するように改善され、そうでない場合はIndexOutOfBoundsException
をスローします。非推奨サイクル:
- < 1.4: 従来の動作(詳細はIssueを参照)
= 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 では、別途互換性アーティファクトが提供されます(詳細はIssueを参照)。
非推奨の 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: 従来の動作(詳細はIssueを参照)
= 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
互換性のない変更の種類: 動作
概要: KAPT によってプロパティに対して生成される合成
$annotations()
メソッドの名前が 1.4 で変更されました。非推奨サイクル:
- < 1.4: プロパティに対する合成
$annotations()
メソッドの名前は<propertyName>@annotations()
テンプレートに従います。= 1.4: プロパティに対する合成
$annotations()
メソッドの名前にはget
プレフィックス (get<PropertyName>@annotations()
) が含まれます。