Kotlin 泛型與協程結合使用可以讓我們編寫更加通用和可重用的代碼。以下是一些示例,展示了如何在 Kotlin 中將泛型與協程一起使用:
創建一個泛型協程函數:
這個函數接受一個泛型參數 T
,并使用 suspend
關鍵字來定義一個掛起函數。這個掛起函數可以操作泛型類型 T
的實例。
import kotlinx.coroutines.*
suspend fun <T> processItem(item: T): T {
delay(1000) // 模擬耗時操作
return item.toString() + " processed"
}
使用泛型協程函數:
在調用泛型協程函數時,我們可以直接傳遞一個泛型類型的實例。協程會自動處理掛起函數的執行和結果的傳遞。
fun main() = runBlocking {
val item = "Hello, Kotlin!"
val processedItem = processItem(item)
println(processedItem)
}
泛型協程作用域:
如果你需要在特定的作用域(如 CoroutineScope
)中運行協程,可以使用 launch
或 async
函數。這些函數也支持泛型參數。
fun main() = runBlocking {
val item = "Hello, Kotlin!"
val job = launch(Dispatchers.Default) {
processItem(item)
}
job.join() // 等待協程完成
}
泛型協程異常處理:
在協程中,異常處理非常重要。你可以使用 try-catch
語句來捕獲和處理異常。由于協程是泛型的,你可以為不同類型的泛型參數定義不同的異常處理邏輯。
suspend fun <T> processItemWithException(item: T): T {
delay(1000) // 模擬耗時操作
if (item is String) {
throw IllegalArgumentException("Invalid item: $item")
}
return item
}
fun main() = runBlocking {
val item = "Hello, Kotlin!"
try {
val processedItem = processItemWithException(item)
println(processedItem)
} catch (e: IllegalArgumentException) {
println("Error: ${e.message}")
}
}
通過這些示例,你可以看到 Kotlin 泛型與協程結合使用的一些基本方法。你可以根據自己的需求進一步擴展和優化這些示例。