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()