You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kotlin中为带泛型的命名Lambda参数设置默认Lambda函数?

为泛型函数的Lambda参数设置默认值

要给你的parseInput泛型函数的第二个Lambda参数设置默认值,核心是提供一个符合(A) -> B签名的通用默认转换逻辑,最常用的就是直接返回输入本身(也就是Kotlin标准库中的identity函数)。下面是具体的实现方案和代码示例:

修改后的完整代码

import kotlin.identity

fun toGreeting(input: Int): String {
    return "hello $input"
}

// 带默认Lambda参数的泛型函数
fun <A, B> parseInput(raw: A, toB: (A) -> B = ::identity): B {
    return toB(raw)
}

fun main() {
    // 场景1:使用默认转换(直接返回输入本身)
    val rawValue = parseInput(1)
    println(rawValue) // 输出:1

    // 场景2:使用自定义转换函数
    val greeting = parseInput(1, ::toGreeting)
    println(greeting) // 输出:hello 1
}

关键细节解释

  • 默认参数的选择:我们用Kotlin标准库的::identity作为默认值,它的签名是(T) -> T——当你不传入自定义转换函数时,编译器会自动推断B的类型等于A,此时identity函数完美匹配(A) -> B的签名,直接返回输入值。
  • 类型推断的作用:调用parseInput(1)时,编译器会根据输入的1(类型Int)推断出A=Int,同时因为没有传入toB,会自动让B=Int,最终返回Int类型的1。
  • 自定义转换的兼容:当你传入::toGreeting时,编译器会根据toGreeting的签名(Int) -> String,推断出A=Int、B=String,完全兼容原来的逻辑。

处理更复杂的默认转换(可选)

如果你需要默认转换支持A到B的类型转换(比如A是Any,B是String),可以自定义默认Lambda,但要注意类型安全:

@Suppress("UNCHECKED_CAST")
fun <A, B> parseInput(raw: A, toB: (A) -> B = { raw.toString() as B }): B {
    return toB(raw)
}

这里我们默认把输入转为字符串再强转为B,但要添加@Suppress("UNCHECKED_CAST")来抑制unchecked cast警告,或者使用reified泛型来让编译器做更严格的类型检查:

inline fun <reified A, reified B> parseInput(raw: A, toB: (A) -> B = { 
    if (raw is B) raw else throw IllegalArgumentException("Cannot cast $raw to ${B::class.simpleName}")
}): B {
    return toB(raw)
}

这个版本会在默认转换时检查类型兼容性,不匹配时抛出异常,更安全。

内容的提问来源于stack exchange,提问作者s-hunter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:11:46