Skip to content

Kotlin 2.3.0-Beta2 有什麼新功能

發佈日期:October 28, 2025

本文件不涵蓋搶先體驗預覽版 (EAP) 的所有功能, 但它強調了一些主要改進。

請參閱 GitHub 變更日誌 中的完整變更列表。

Kotlin 2.3.0-Beta2 版本已發佈!以下是此 EAP 版本的一些詳細資訊:

IDE 支援

支援 2.3.0-Beta2 的 Kotlin 插件已捆綁在最新版本的 IntelliJ IDEA 和 Android Studio 中。 您無需更新 IDE 中的 Kotlin 插件。 您只需在建置腳本中將 Kotlin 版本變更 為 2.3.0-Beta2。

有關詳細資訊,請參閱更新到新版本

語言

Kotlin 2.3.0-Beta2 專注於功能穩定化,引入了新的未使用回傳值檢查機制, 並改進了上下文感知解析。

穩定功能

在先前的 Kotlin 版本中,一些新的語言功能以實驗性 (Experimental) 和 Beta 階段推出。 我們很高興地宣布,在此版本中,以下功能已成為穩定版

預設啟用功能

在 Kotlin 2.3.0-Beta2 中,以下語言功能現在預設啟用:

請參閱 Kotlin 語言設計功能和提案的完整列表

Experimental

未使用回傳值檢查器

Kotlin 2.3.0-Beta2 引入了一項新功能:未使用回傳值檢查器。 當表達式回傳的值不是 UnitNothing,且未傳遞給函式、未在條件中檢查或未以其他方式使用時,此功能會發出警告。

您可以使用它來捕獲錯誤,例如函式呼叫產生有意義的結果,但結果卻被默默丟棄,這可能導致意外行為或難以追蹤的問題。

檢查器會忽略來自遞增操作(例如 ++--)的回傳值。

請考慮以下範例:

kotlin
fun formatGreeting(name: String): String {
    if (name.isBlank()) return "Hello, anonymous user!"
    if (!name.contains(' ')) {
        // 檢查器會報告此結果被忽略的警告
        "Hello, " + name.replaceFirstChar(Char::titlecase) + "!"
    }
    val (first, last) = name.split(' ')
    return "Hello, $first! Or should I call you Dr. $last?"
}

在此範例中,建立了一個字串但從未使用,因此檢查器將其報告為被忽略的結果。

此功能為實驗性。 若要啟用,請將以下編譯器選項新增至您的 build.gradle.kts 檔案:

kotlin
kotlin {
    compilerOptions {
        freeCompilerArgs.add("-Xreturn-value-checker=check")
    }
}

使用此選項,檢查器僅報告來自已標記表達式的被忽略結果,就像 Kotlin 標準函式庫中的大多數函式一樣。

若要標記您的函式,請使用 @MustUseReturnValues 註解來標記您希望檢查器報告被忽略回傳值的範圍。

例如,您可以標記整個檔案:

kotlin
// 標記此檔案中的所有函式和類別,以便檢查器報告未使用回傳值
@file:MustUseReturnValues

package my.project

fun someFunction(): String

或特定類別:

kotlin
// 標記此類別中的所有函式,以便檢查器報告未使用回傳值
@MustUseReturnValues
class Greeter {
    fun greet(name: String): String = "Hello, $name"
}

fun someFunction(): Int = ...

您也可以使用 full 模式標記您的整個專案。 為此,請將以下編譯器選項新增至您的 build.gradle.kts 檔案:

kotlin
kotlin {
    compilerOptions {
        freeCompilerArgs.add("-Xreturn-value-checker=full")
    }
}

在此模式下,Kotlin 會自動將您編譯的檔案視為已使用 @MustUseReturnValues 註解標記,因此檢查器會套用到您專案函式的所有回傳值。

您可以透過使用 @IgnorableReturnValue 註解標記特定函式來抑制警告。 註解那些忽略結果很常見且預期的函式,例如 MutableList.add

kotlin
@IgnorableReturnValue
fun <T> MutableList<T>.addAndIgnoreResult(element: T): Boolean {
    return add(element)
}

您可以抑制警告,而無需將函式本身標記為可忽略。 為此,請將結果指定給一個帶有底線語法 (_) 的特殊匿名變數:

kotlin
// 不可忽略的函式
fun computeValue(): Int = 42

fun main() {

    // 報告警告:結果被忽略
    computeValue()

    // 僅在此呼叫點使用特殊未使用變數抑制警告
    val _ = computeValue()
}

我們非常感謝您在 YouTrack 中提供回饋。有關更多資訊,請參閱該功能的 KEEP

Experimental

上下文感知解析的變更

目前,IntelliJ IDEA 中對此功能的程式碼分析、程式碼補齊和語法突顯支援僅在 2025.3 EAP 版本中提供。

上下文感知解析仍為實驗性,但我們將根據使用者回饋持續改進此功能:

  • 現在將目前型別的 sealed 和封閉超型別視為搜尋上下文範圍的一部分。不考慮其他超型別範圍。
  • 在涉及型別運算符和相等性的情況下,如果使用上下文感知解析導致解析模糊,編譯器現在會報告警告。例如,當匯入類別的衝突宣告時,可能會發生這種情況。

有關詳細資訊,請參閱 KEEP 中當前提案的完整文字。

Kotlin/JVM:支援 Java 25

從 Kotlin 2.3.0-Beta2 開始,編譯器可以生成包含 Java 25 位元組碼的類別。

Kotlin/Native

Experimental

透過 Swift 匯出改善互通性

Kotlin 2.3.0-Beta2 透過 Swift 匯出進一步改善了 Kotlin 與 Swift 的互通性,新增了對原生列舉類別和可變參數函式的支援。

以前,Kotlin 的列舉會匯出為普通的 Swift 類別。現在映射是直接的,您可以直接使用常規的原生 Swift 列舉。例如:

kotlin
// Kotlin
enum class Color(val rgb: Int) {
    RED(0xFF0000),
    GREEN(0x00FF00),
    BLUE(0x0000FF)
}

val color = Color.RED
Swift
// Swift
public enum Color: Swift.CaseIterable, Swift.LosslessStringConvertible, Swift.RawRepresentable {
    case RED, GREEN, BLUE

    var rgb: Int { get } 
}

Kotlin 的 vararg 函式現在也直接映射到 Swift 的可變參數函式參數。

此類函式允許您傳遞可變數量的引數。當您不知道引數的數量或想要建立或傳遞集合而無需指定其型別時,這非常有用。例如:

kotlin
// Kotlin
fun log(vararg messages: String)
Swift
// Swift
func log(_ messages: String...)

可變參數函式參數中的泛型型別尚未支援。

偵錯模式中預設啟用泛型型別邊界上的型別檢查

從 Kotlin 2.3.0-Beta2 開始,在偵錯模式中,預設啟用泛型型別邊界上的型別檢查,協助您更早發現與未經檢查的型別轉換相關的錯誤。此變更提高了安全性,並使跨平台的無效泛型型別轉換偵錯更具可預測性。

以前,在 Kotlin/Native 中,未經檢查的型別轉換可能導致堆污染和記憶體安全違規,而這些問題可能不會被注意到。 現在,這些情況會像 Kotlin/JVM 或 Kotlin/JS 一樣,穩定地以運行時型別轉換錯誤失敗。例如:

kotlin
fun main() {
    val list = listOf("hello")
    val x = (list as List<Int>)[0]
    println(x) // 現在會拋出 ClassCastException 錯誤
}

此程式碼以前會列印 6;現在它在偵錯模式中會如預期地拋出 ClassCastException 錯誤。

有關更多資訊,請參閱型別檢查與型別轉換

Kotlin/Wasm

預設啟用完整限定名稱

在 Kotlin/Wasm 目標上,完整限定名稱 (FQNs) 在運行時並未預設啟用。 您必須手動啟用對 KClass.qualifiedName 屬性的支援。

以前,只有類別名稱(不包含套件)可存取,這導致了從 JVM 移植到 Wasm 目標的程式碼或期望在運行時使用完整限定名稱的函式庫出現問題。

在 Kotlin 2.3.0-Beta2 中,KClass.qualifiedName 屬性在 Kotlin/Wasm 目標上預設啟用。 這表示 FQN 在運行時無需任何額外配置即可使用。

預設啟用 FQN 提高了程式碼的可移植性,並透過顯示完整限定名稱使運行時錯誤更具資訊性。

由於編譯器優化,使用 Latin-1 字串常值(string literals)的緊湊儲存方式來減少中繼資料,此變更不會增加編譯後的 Wasm 二進位檔案大小。

wasmWasi 預設啟用新的例外處理提案

以前,Kotlin/Wasm 對所有目標,包括 wasmWasi,都使用舊版例外處理提案。然而,大多數獨立的 WebAssembly 虛擬機器 (VM) 正在與新版例外處理提案保持一致。

從 Kotlin 2.3.0-Beta2 開始,wasmWasi 目標預設啟用新的 WebAssembly 例外處理提案,確保與現代 WebAssembly 運行時更好地相容。

對於 wasmWasi 目標,此變更引入得早是安全的,因為針對它的應用程式通常在較不複雜的運行時環境中執行(通常在單一特定 VM 上執行),並且通常由使用者控制,從而降低了相容性問題的風險。

對於 wasmJs 目標,新的例外處理提案預設仍為關閉。 您可以使用 -Xwasm-use-new-exception-proposal 編譯器選項手動啟用它。

Kotlin/JS

Experimental

使用 `JsExport` 匯出 suspend 函式的新方法

以前,@JsExport 註解不允許將 suspend 函式(或包含此類函式的類別和介面)匯出到 JavaScript。您必須手動包裝每個 suspend 函式,這既麻煩又容易出錯。

從 Kotlin 2.3.0-Beta2 開始,suspend 函式可以使用 @JsExport 註解直接匯出到 JavaScript。

啟用 suspend 函式匯出消除了樣板程式碼的需求,並改進了 Kotlin/JS 和 JavaScript/TypeScript (JS/TS) 之間的互通性。Kotlin 的非同步函式現在可以直接從 JS/TS 呼叫,無需額外程式碼。

若要啟用此功能,請將以下編譯器選項新增至您的 build.gradle.kts 檔案:

kotlin
kotlin {
    compilerOptions {
        freeCompilerArgs.add("-XXLanguage:+JsAllowExportingSuspendFunctions")
    }
}

啟用後,標記有 @JsExport 註解的類別和函式可以包含 suspend 函式,而無需額外的包裝器。

它們可以作為常規 JavaScript 非同步函式使用,也可以作為非同步函式被覆寫:

kotlin
@JsExport
open class Foo {
    suspend fun foo() = "Foo"
}
typescript
class Bar extends Foo {
    override async foo(): Promise<string> {
        return "Bar"
    }
}

此功能為實驗性。我們非常感謝您在我們的問題追蹤器 YouTrack 中提供回饋。

Experimental

使用 `BigInt64Array` 型別表示 Kotlin 的 `LongArray` 型別

以前,Kotlin/JS 將 LongArray 表示為 JavaScript 的 Array<bigint>。這種方法可行,但對於與期望型別化陣列的 JavaScript API 互通性而言並不理想。

從此版本開始,Kotlin/JS 現在在編譯為 JavaScript 時,使用 JavaScript 內建的 BigInt64Array 型別來表示 Kotlin 的 LongArray 值。

使用 BigInt64Array 簡化了與使用型別化陣列的 JavaScript API 的互通性。它還允許接受或回傳 LongArray 的 API 更自然地從 Kotlin 匯出到 JavaScript。

若要啟用此功能,請將以下編譯器選項新增至您的 build.gradle.kts 檔案:

kotlin
kotlin {
    js {
        // ...
        compilerOptions {
            freeCompilerArgs.add("-Xes-long-as-bigint")
        }
    }
}

此功能為實驗性。我們非常感謝您在我們的問題追蹤器 YouTrack 中提供回饋。

Gradle

Kotlin 2.3.0-Beta2 與 Gradle 7.6.3 至 9.0.0 完全相容。您也可以使用最新的 Gradle 版本。然而,請注意,這樣做可能會導致棄用警告,並且某些新的 Gradle 功能可能無法正常運作。

此外,最低支援的 Android Gradle plugin 版本現在是 8.2.2,最高支援版本是 8.13.0。

Experimental

用於在 Gradle 專案中註冊生成原始碼的新 API

Kotlin 2.3.0-Beta2 在 KotlinSourceSet 介面中引入了一個新的實驗性 API,您可以使用它在 Gradle 專案中註冊生成原始碼。

這個新 API 是一項生活品質改進,有助於 IDE 區分生成的程式碼和常規原始碼檔案。 該 API 允許 IDE 在使用者介面中以不同方式突顯生成的程式碼,並在匯入專案時觸發生成任務。我們目前正在 IntelliJ IDEA 中添加此支援。該 API 對於生成程式碼的第三方插件或工具(例如 KSP (Kotlin 符號處理))也特別有用。

若要註冊包含 Kotlin 或 Java 檔案的目錄,請在您的 build.gradle(.kts) 檔案中使用 SourceDirectorySet 型別的 generatedKotlin 屬性。例如:

kotlin
val generatorTask = project.tasks.register("generator") {
    val outputDirectory = project.layout.projectDirectory.dir("src/main/kotlinGen")
    outputs.dir(outputDirectory)
    doLast {
        outputDirectory.file("generated.kt").asFile.writeText(
            // language=kotlin
            """
            fun printHello() {
                println("hello")
            }
            """.trimIndent()
        )
    }
}

kotlin.sourceSets.getByName("main").generatedKotlin.srcDir(generatorTask)

此範例建立了一個新的任務 "generator",其輸出目錄為 "src/main/kotlinGen"。當任務執行時,doLast {} 區塊會在輸出目錄中建立一個 generated.kt 檔案。最後,該範例將任務的輸出註冊為生成的原始碼。

作為新 API 的一部分,allKotlinSources 屬性提供對 KotlinSourceSet.kotlinKotlinSourceSet.generatedKotlin 屬性中註冊的所有原始碼的存取。

標準函式庫

在 Kotlin 2.3.0-Beta2 中,新的時間追蹤功能 kotlin.time.Clockkotlin.time.Instant 成為穩定版

Compose 編譯器:縮小化 Android 應用程式的堆疊追蹤

從 Kotlin 2.3.0 開始,當應用程式由 R8 縮小化時,編譯器會為 Compose 堆疊追蹤輸出 ProGuard 映射。 這擴展了以前僅在可偵錯變體中可用的實驗性堆疊追蹤功能。

堆疊追蹤的發佈變體包含群組鍵,可用於在縮小化應用程式中識別可組合函式,而無需在運行時記錄來源資訊的開銷。群組鍵堆疊追蹤要求您的應用程式必須使用 Compose runtime 1.10 或更高版本建置。

若要啟用群組鍵堆疊追蹤,請在初始化任何 @Composable 內容之前新增以下行:

kotlin
Composer.setDiagnosticStackTraceMode(ComposeStackTraceMode.GroupKeys)

啟用這些堆疊追蹤後,即使應用程式經過縮小化,Compose runtime 也會在組合、測量或繪製階段捕獲崩潰後附加其自己的堆疊追蹤:

text
java.lang.IllegalStateException: <message>
          at <original trace>
Suppressed: androidx.compose.runtime.DiagnosticComposeException: Composition stack when thrown:
         at $compose.m$123(SourceFile:1)
         at $compose.m$234(SourceFile:1)
          ...

在此模式下,Jetpack Compose 1.10 生成的堆疊追蹤僅包含仍需去混淆的群組鍵。 這在 Kotlin 2.3.0 版本中得到解決,Compose 編譯器 Gradle 插件現在將群組鍵條目附加到 R8 生成的 ProGuard 映射檔案中。如果您發現編譯器未能為某些函式建立映射時出現新的警告,請向 Google 問題追蹤器報告。

由於依賴 R8 映射檔案,Compose 編譯器 Gradle 插件僅在啟用 R8 進行建置時為群組鍵堆疊追蹤建立去混淆映射。