我是来自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() })  
}

Kotlin相关问答推荐

如何在 Big Data 中使用Inc过滤器?

Lambda和普通Kotlin函数有什么区别?

Kotlin:将泛型添加到列表任何>

如何在数据类中删除空格 (String)?

为什么我的通用Kotlin函数中的这个转换未经判断?

Kotlin 如何使用其 get 函数在内部检索映射值

当 func 重载时,kotlin 如何确定调用哪个 func?

如何为 Kotlin 中的每个循环设置以避免越界异常

Kotlin 中多个 init 块的用例?

什么是 .kotlin_builtins 文件,我可以从我的 uberjars 中省略它们吗?

Intellij 显示 build.gradle.kts 中的每一行都是红色的

Kotlin通过映射委托属性,如果映射中不存在,则抛出NoTouchElementException

Android 上的 Kotlin:将map到list

如何在Kotlin中使用ViewModelProviders

(kotlin的Moshi)@Json vs@field:Json

Kotlin 中内部可见性修饰符的范围

kotlin中密封类和密封接口的区别是什么

Kotlin中的嵌套let块

如何在 IntelliJ IDEA 中禁用粘贴时将 Java 转换为 Kotlin?

在 intelliJ 元素中集成 Kotlinx 协程