我是来自Scala背景的Kotlin.
我想做一些基于多态函数的泛型函数.
示例:
fun f(v: Int): String = (v+1).toString()
fun f(v: String): String = v.toUpperCase()
fun <T> doubl(v: T) = f(v)+f(v)
我可以用不同的参数类型定义f()
的不同版本,但我不能基于另一个定义doubl
这样的泛型函数.
我是来自Scala背景的Kotlin.
我想做一些基于多态函数的泛型函数.
示例:
fun f(v: Int): String = (v+1).toString()
fun f(v: String): String = v.toUpperCase()
fun <T> doubl(v: T) = f(v)+f(v)
我可以用不同的参数类型定义f()
的不同版本,但我不能基于另一个定义doubl
这样的泛型函数.
我不认为您可以在Kotlin中做到这一点,您必须至少更改参数的数量/类型.
但您可以try 这样做:(使用经过修改的参数)
inline fun <reified T> doubl(v: T): String {
return when (T::class) {
Int::class -> f(v as Int)
String::class -> f(v as String)
else -> throw IllegalArgumentException("Unsupported type")
}.let { it + it }
}
fun f(v: Int): String = (v + 1).toString()
fun f(v: String): String = v.toUpperCase()
另一种方法是使用扩展函数:
fun Int.f(): String = (this + 1).toString()
fun String.f(): String = this.toUpperCase()
fun <T> doubl(v: T, transform: T.() -> String) = v.transform() + v.transform()
fun main() {
println(doubl(1) { f() })
println(doubl("kot") { f() })
}