1

我是 Kotlin 语言的新手,但是我刚刚遇到了一些其他语言中没有的奇怪行为,所以我想问为什么我不能这样做:

fun <T> methodName()
{
    // whatev~ 
}

fun <T, K> methodName()
{
    // whatev~   
}

此代码引发“冲突重载”错误。

在其他语言中,例如 C#,我可以做到这一点,这是一个非常巧妙的技巧,只有一种方法可以同时适用于一种或多种类型。

我发现的唯一解决方法是在每个新方法中添加一个我永远不会使用的可选参数,例如:

fun <T> methodName()
{

}

fun <T, K> methodName(crappyParam: String = "")
{

}
4

1 回答 1

1

这两种方法在 JVM 类型系统(不支持泛型)中具有相同的签名,这是不允许的。

JVM 语言可以“破坏”这些方法,例如在字节码中赋予它们不同的名称。C# 的 JVM 实现必须这样做。

但科特林没有。这样做会损害与 Java 的互操作性,这是 Kotlin 的主要要求之一。

于 2018-04-20T09:08:29.470 回答