如何在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
相关产品推荐
相关产品推荐

