Kotlin 函数重载的替代方法

Kotlin 函数重载的替代方法,kotlin,overloading,Kotlin,Overloading,下面的代码 fun getValue(): Int { return 42 } fun getValue(): String { return "Foo" } 给出以下错误: 冲突重载:本地最终值:中定义的字符串 main,local-final-fun-getValue:main中定义的Int 有没有办法不用重命名其中一个函数就可以解决这个问题 inline fun <reified T> getValue(): T = when (T::class

下面的代码

fun getValue(): Int {
   return 42
}

fun getValue(): String {
   return "Foo"
}
给出以下错误:

冲突重载:本地最终值:中定义的字符串 main,local-final-fun-getValue:main中定义的Int

有没有办法不用重命名其中一个函数就可以解决这个问题

inline fun <reified T> getValue(): T =
        when (T::class) {
            Int::class -> 42 as T
            String::class -> "foo" as T
            else -> throw IllegalArgumentException()
        }
可以使用带有具体化类型参数的泛型内联函数。 给定的代码块在每次调用时内联


缺点是编译器无法检查错误的类型参数。您将得到一个IllegalArgumentException。

首先,不鼓励在Kotlin中编写显式getter,建议使用以下方法:

val value : Int get() = 42
val value : String get() = "Foo"
然而,这仍然不能解决您的问题。既然你没有告诉我们你为什么需要这样的声明,我只能给你一些建议:

为这两个变量(值除外)找到一个更有意义的名称。例如:

val intValue get() = 42 // note that you can omit :Int in this case
val textValue get() = "Foo"
如果两个值都绑定在一起,则可以使用一对:

现在,您可以通过value.first和value.second访问这两个值。注意,to是一个创建对的符号,因此上面的符号相当于更详细的符号

val value : Pair<Int, String> get() = Pair(42, "Foo")
在解决方案2和3中,可以使用如下所示的:

val (intVal, textVal) = value

客户机应该如何指定他实际希望从类的实例中获取的值?这些方法名称不明确

看看方法签名,只有返回类型不同,这是不够的

Java重载方法的规则也适用于Kotlin:

重载方法通过传入方法的参数的数量和类型来区分

在您的情况下,只需给出适当的可区分名称。如果您的类不需要显式定义默认getter,您也可以简单地创建这些值属性。

简短回答:否

Long anser:函数签名由该函数的名称及其参数列表组成

由于返回类型不属于签名,因此编译器无法在调用时区分要使用的函数:

val v = getValue() // should v be inferred to Int or String?
即使不明确指定返回类型也可以解决问题:

val v: Int = getValue() 
因为getValue是在不知道返回值将分配到哪里的情况下首先计算的


因此,最好的选择是为其中一个函数选择一个不同的名称。

。。。您为什么要这样做?您打算如何使用这些功能?即使从理论上讲?@user202729很明显,我不想这么做。代码片段是我对重载的误解造成的。我很感激大家教育我!有些语言实际上支持这一点——这并不像人们所说的那么愚蠢。我认为OP应该重新考虑是否真的有必要使用两个同名的变量/getter,而不是使用这样的解决方案。谢谢你回答了这个问题!我认为使用Java文档源代码解决Kotlin问题不是一个好主意,尽管两者都在JVM上运行。这是相关的,因为规则也适用于Kotlin overloadsKotlin是一种多平台语言,到目前为止有三种实现:JDK、JS和native。它与JVM有很强的链接,但这不是一种正式的关系。顺便说一句,有这样一种关系,只是目前主要是TODO。我不认为这是不引用Java源代码的原因,但很好,删除它
val v = getValue() // should v be inferred to Int or String?
val v: Int = getValue()