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

如何在Kotlin构造函数中指定带泛型类型的函数参数?

如何定义支持任意同类型输入输出的函数参数?

你需要的是一个能适配任意类型的多态函数:接收某类型T的输入,返回同类型T,而且这个函数不能绑定到类的单一泛型上——毕竟你要在类里用它同时处理String、Int这类不同类型的调用。

在Kotlin里,可以通过泛型函数类型来实现这个需求,直接在构造函数参数里定义泛型函数签名即可:

class Foo(
    val f: <T> (T) -> T
)

这样定义后,你可以传入符合要求的多态函数(比如最常见的恒等函数),并且在类内部安全地调用它处理不同类型的输入:

fun main() {
    // 传入恒等函数,直接返回输入值
    val foo = Foo { it }
    
    val s: String = foo.f("a string")
    val i: Int = foo.f(42)
    
    println(s) // 输出:a string
    println(i) // 输出:42
}

如果需要自定义多态逻辑,也可以编写适配不同类型的泛型函数传入,比如:

// 针对String添加前缀,Int乘2,其他类型返回原值
fun <T> customFunc(input: T): T = when (input) {
    is String -> "processed_$input" as T
    is Int -> (input * 2) as T
    else -> input
}

val foo2 = Foo(::customFunc)
println(foo2.f("test")) // 输出:processed_test
println(foo2.f(10))    // 输出:20

需要注意的是,自定义多态函数里的as T属于未检查类型转换,要确保函数逻辑不会出现类型不匹配的情况,避免运行时异常。

这种方式的核心是利用Kotlin的泛型函数类型特性,让函数参数本身具备泛型能力,而不是把泛型绑定到类上,完美匹配你的使用场景。

内容的提问来源于stack exchange,提问作者Duncan McGregor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:15:58