为什么不能使用相同名称但具有不同泛型的方法?

时间:2018-04-20 06:24:01

标签: kotlin kotlin-generics

我在Kotlin语言方面很新,但我刚遇到一些其他语言没有的奇怪行为,所以我想问为什么我不能做这样的事情:

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

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

此代码抛出“冲突重载”错误。

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

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

fun <T> methodName()
{

}

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

}

1 个答案:

答案 0 :(得分:1)

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

JVM语言可以&#34; mangle&#34;这样的方法,例如在字节码中给它们不同的名称。 C#的JVM实现必须。

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