Kotlin 2.4.20のStackTraceRecoverableによるコルーチンのスタックトレース回復、allEqual/allDistinctでのコレクション同値チェック、SwiftエクスポートとWasm対応を実行結果で確認します。
この記事が解決する悩み
- アップデートで何が良くなるのか、要点だけ知りたい
- コルーチンの例外でスタックトレースが追いづらい
対象読者: Kotlinでアプリやサーバーを書いている人
前提知識: コルーチンを使った経験があること
結論
Kotlin 2.4.20は2026年9月にリリースされた最新バージョンで、コルーチンのデバッグ体験を大きく改善するStackTraceRecoverableインターフェース、コレクション操作を大幅に簡略化するallDistinct()/allEqual()系統の新関数、Kotlin/NativeのSwiftエクスポート強化、そしてKotlin/WasmのWasmtime対応が目玉です。
標準ライブラリの追加としては、これが一番気になるはず。さっそく見てみましょう。
@OptIn(ExperimentalStdlibApi::class)
fun main() {
data class Response(val id: String, val answer: String)
val responses = listOf(
Response("P001", "Yes"),
Response("P002", "Maybe"),
Response("P003", "No")
)
// 全ての回答が同じか?
println(responses.allEqualBy { it.answer }) // false
// 参加者が全員ユニークか?
println(responses.allDistinctBy { it.id }) // true
// 回答が全て同じか?
println(responses.map { it.answer }.allEqual()) // false
// 回答が全て異なるか?
println(responses.map { it.answer }.allDistinct()) // true
}
Kotlin 2.4.20 の主要変更点
まずは全体像を把握しましょう。2.4.20の変更点は以下の4つのカテゴリに分類できます。
| カテゴリ | 主な変更点 | ステータス |
|---|---|---|
| 標準ライブラリ | StackTraceRecoverable、コレクション同値/ユニークチェック、kotlin.test拡張 | Stable(一部Experimental) |
| Kotlin/Native | Swiftエクスポート新機能、Package.swift自動生成、インクリメンタルコンパイル改善 | Alpha〜Beta |
| Kotlin/Wasm | Wasmtime対応、コンパニオンオブジェクト初期化順序改善、バリナリサイズ削減 | Beta |
| Kotlin/JS | ブラウザテスト用DSL、suspendラムダのasync関数エクスポート | Experimental |
| ビルドツール | Build Tools APIがJS/Wasm/Metadata対応、kotlinrネイティブイメージ | Experimental |
さらに、Kotlin Toolchain 0.12も同時期にリリースされ、マルチプラットフォームライブラリの公開とWasmアプリケーションのプレビューが追加されています。こちらも後ほど触れます。
コルーチンスタックトレース回復(StackTraceRecoverable)
これが個人的に一番の注目機能です。コルーチンを使っていると、非同期処理の中で例外が発生したときにスタックトレースが切れてしまい、「どこで例外が起きたのか」が追いにくい問題がありました。
kotlinx.coroutines はJVM上でスタックトレース回復という仕組みを持っていて、例外を再スローするときに元のスタックトレースを保持したコピーを作ってくれます。ただし、自動的にコピーを作れるのは「メッセージのみ」「原因のみ」「両方」「引数なし」のいずれかのコンストラクタを持つ例外クラスだけです。カスタム例外に追加の引数があると、コピーが作れませんでした。
Kotlin 2.4.20ではこの問題を解決するために、標準ライブラリに StackTraceRecoverable インターフェースが追加されました。kotlinx.coroutinesに依存せずに、自分の例外クラスでスタックトレース回復をサポートできます。
@OptIn(kotlin.coroutines.ExperimentalStdlibCoroutineSupportApi::class)
class BadResponseCodeException(val responseCode: Int)
: Exception(), StackTraceRecoverable<BadResponseCodeException> {
override fun copyForStackTraceRecovery(): BadResponseCodeException {
val result = BadResponseCodeException(responseCode)
result.initCause(this)
return result
}
}
実装のポイントは3つです。
StackTraceRecoverable<T>を実装する(Tは自身の型)copyForStackTraceRecovery()で新しいインスタンスを返す- 元の例外を
initCause()でcauseとして設定する(デバッグ性が向上)
このインターフェースは全プラットフォームで利用可能ですが、kotlinx.coroutines が実際にスタックトレース回復を行うのはJVMのみです。とはいえ、共通コードで例外クラスを定義しておけば、JVMで動かしたときに自動的に効果が発揮されます。
コレクションの同値・ユニークチェック関数
2.4.20では4つの新しい実験的関数が標準ライブラリに追加されました。これらは @OptIn(ExperimentalStdlibApi::class) が必要です。
| 関数 | チェック内容 |
|---|---|
allDistinct() |
コレクション内のすべての要素がユニークか |
allDistinctBy() |
指定したプロパティの値がすべてユニークか |
allEqual() |
コレクション内のすべての要素が同じ値か |
allEqualBy() |
指定したプロパティの値がすべて同じか |
実際の動きを確認してみましょう。
@OptIn(ExperimentalStdlibApi::class)
fun main() {
data class Order(val orderId: String, val customerId: String, val amount: Int, val status: String)
val orders = listOf(
Order("ORD-001", "C001", 12000, "shipped"),
Order("ORD-002", "C001", 8000, "pending"),
Order("ORD-003", "C002", 15000, "shipped"),
Order("ORD-004", "C003", 12000, "cancelled")
)
println(orders.allDistinctBy { it.orderId }) // true
println(orders.allDistinctBy { it.customerId }) // false
println(orders.allEqualBy { it.status }) // false
println(orders.allEqualBy { it.amount }) // false
val statuses = orders.map { it.status }
println(statuses.allEqual()) // false
println(statuses.allDistinct()) // false
println(listOf(1, 2, 3).allDistinct()) // true
println(listOf(42, 42, 42).allEqual()) // true
}
これらの関数は Collection、Sequence、Array のすべてで使えます。内部実装は HashSet を使っているので、大規模コレクションでも効率的です。
今までのコードと比較してみましょう。
// Before
val allSame = responses.map { it.status }.distinct().size == 1
val allUnique = responses.map { it.id }.distinct().size == responses.size
// After
val allSame = responses.allEqualBy { it.status }
val allUnique = responses.allDistinctBy { it.id }
可読性が段違いですね。「何をチェックしているか」がメソッド名から一瞬で分かります。
実測メモ: allDistinct() と allEqual() は実験的なAPIなので、そのまま書くとコンパイルが止まります。Kotlin 2.4.20 で試したところ「this declaration needs opt-in」と言われたので、@OptIn(ExperimentalStdlibApi::class) を付けてください。クラスかファイル単位で一度書けば済みます。
Kotlin/Native: Swiftエクスポートの強化
Kotlin MultiplatformでiOSアプリを開発している人にとっては、今回のリリースで一番嬉しい変更かもしれません。
Package.swift の自動生成
これまでKotlin/Nativeの成果物をSwiftPMで利用するには、手動で Package.swift を書く必要がありました。2.4.20ではビルド時に自動生成されるようになり、SwiftPMの依存関係としてKotlin Multiplatformモジュールを直接宣言できるようになります。
kotlin {
iosArm64()
iosSimulatorArm64()
swiftExport {
packageName.set("MyKMPModule")
}
}
sealed classのエクスポート対応
Kotlinの sealed class がSwiftのenumとして適切にエクスポートされるようになりました。代数的データ型をSwiftのパターンマッチングで扱えます。
sealed class ApiResult {
data class Success(val data: String) : ApiResult()
data class Error(val code: Int, val message: String) : ApiResult()
}
Kotlin/Wasm: Wasmtime対応と最適化
Kotlin/Wasmは引き続きBetaですが、2.4.20でいくつか改善が入っています。
- Wasmtime対応: Kotlin Gradle Pluginから
wasmWasiターゲットのランタイムとしてWasmtimeを選択可能に - コンパニオンオブジェクト初期化順序: JVMの挙動に合わせるよう修正され、プラットフォーム間の一貫性が向上
- バリナリサイズ削減: 関数型インターフェースのバイナリサイズが最適化
- トップレベル
require()の扱い変更:@JsFun内でのrequire()呼び出しが適切に処理されるようになりました
Kotlin Toolchain 0.12: マルチプラットフォームライブラリ公開とWasmアプリ
2.4.20と同時期に、Kotlin Toolchain 0.12もリリースされました。こちらも合わせてチェックしておきましょう。
マルチプラットフォームライブラリの公開(プレビュー)
Toolchain 0.11ではJVMライブラリのみ対応だった公開機能が、0.12でマルチプラットフォームに対応しました。JVM、Android、iOS、WasmJSを1つの設定でMavenに公開できます。
product:
type: lib
platforms: [jvm, android, iosArm64, iosSimulatorArm64, wasmJs]
settings:
publishing:
enabled: true
group: org.example
version: 1.0.0
Compose Hot Reload のMCPサーバー
Compose Hot ReloadにMCPサーバーが搭載されました。AIエージェントがアプリケーションと対話できるようになり、ホットリロードのトリガーやスクリーンショット取得、セマンティックツリーの検査が可能です。
{
"mcpServers": {
"Compose Hot Reload": {
"command": "./kotlin",
"args": ["compose-hot-reload-mcp-server"]
}
}
}
Kotlin 2.4.20 へのアップデート手順
プロジェクトのアップデートは基本的に build.gradle.kts のバージョン番号を変えるだけです。
plugins {
kotlin("jvm") version "2.4.20"
kotlin("multiplatform") version "2.4.20"
}
コマンドラインコンパイラはGitHub Releasesからダウンロードできます。なお、2.4.20ではkotlinrというネイティブイメージのランナーコマンドも実験的に提供されています。
まとめ
| 機能 | ステータス | 使えるシチュエーション |
|---|---|---|
| StackTraceRecoverable | Stable with opt-in | カスタム例外クラスでのコルーチン例外デバッグ |
| allDistinct / allEqual | Experimental | コレクションの簡単な検証・バリデーション |
| Swiftエクスポート強化 | Alpha〜Stable | KMPでiOSアプリをSwiftPM管理している場合 |
| Wasmtime対応 | Beta | Wasm/WASIターゲットのランタイム選択 |
| JSテストDSL | Experimental | Kotlin/JSのブラウザテスト |
| Build Tools API拡張 | Experimental | ビルドツール統合が必要なケース |
Kotlin 2.4.20は、特に コルーチンを多用するプロジェクト と Kotlin MultiplatformでiOSをターゲットにしているプロジェクト にとって即座にアップデートする価値のあるリリースです。標準ライブラリの品質向上も継続的に行われており、日常のコーディングが少しずつ快適になっていくのを感じますね。
なお、Kotlin 2.4.20 からは互換性ガイドが更新されているので、メジャーバージョンアップの際は Kotlin 2.4 compatibility guide を一読しておくと安全です。
検証環境
| OS | Windows 11 (build 10.0.26200) |
|---|---|
| CPU | AMD Ryzen 9 PRO 8945HS w/ Radeon 780M Graphics |
| メモリ | 28GB |
| 言語/ツール | Kotlin 2.4.20(公式のコンイラ配布を一時ディレクトリに展開) / JDK 25.0.1 |
| 使用コマンド | kotlinc main.kt -include-runtime -d main.jar && java -jar main.jar |
| 測定日 | 2026-09-17 |
上記の環境で実際に実行して確認した結果です。環境が異なる場合は挙動が変わることがあります。

参考
本文の記述は以下の一次情報を確認して書いています。
- Kotlin 公式ドキュメント — What’s new in Kotlin 2.4.20
- Kotlin 公式ドキュメント — Swift export によるSwift相互運用
- Kotlin 公式ドキュメント — Kotlin/Wasm 概要
- Kotlin 公式ドキュメント — Compatibility guide for Kotlin 2.4.x
あわせて読みたい
- 【C#】C# 14 逆引き — field・拡張メンバー・null条件代入【.NET 10】
- 【Java】JDK 27 逆引き — LazyConstant・プリミティブ型パターン
- 【Rust】非同期クロージャ(async || {})の書き方・移行ガイド
- 【OSS】OpenCode 入門ガイド — OSS AIコーディングエージェントの使い方
【広告】お名前.comならドメイン取得が格安。![]()
【広告】このサイトはConoHa WINGで運営しています。安定した高速サーバーで快適にブログを書けています。いつもありがとう!!![]()

コメント