替代function重载
下面的代码
fun getValue(): Int { return 42 } fun getValue(): String { return "Foo" }
给出以下错误:
有冲突的重载 :本地最终乐趣getValue():在本地最终乐趣中定义的字符串getValue():在main中定义的Int。
有没有办法避免重命名的function之一?
首先,在Kotlin中写明确的获得者是不鼓励的,建议使用下列代码:
val value : Int get() = 42 val value : String get() = "Foo"
但是,这仍然不能解决您的问题。 既然你没有给我们提供任何信息, 为什么你需要这样的声明,我只能给你一些建议:
-
为值以外的其他variablesfind更有意义的名称。 例如:
val intValue get() = 42 // note that you can omit :Int in this case val textValue get() = "Foo"
-
如果两个值绑定在一起,则可以使用
Pair
:val value get() = 42 to "Foo"
现在,您可以通过
value.first
和value.second
访问这两个值。 请注意,to
创建Pair
的中缀函数 ,上面相当于更详细的表示法val value : Pair
get() = Pair(42, "Foo") -
如果
value
是值得存储在自己的对象,而不是使用一个Pair
,你可以创建自己的数据类:data class MyData(val intVal : Int, val textVal : Text) val value get() = MyData(42, "Foo")
通过解决方案2和3 ,可以使用解构声明 ,如下所示:
val (intVal, textVal) = value
简短的回答:不。
Long anser:函数签名由该函数的名称及其参数列表组成。
由于返回types不属于签名,编译器无法区分调用哪个函数:
val v = getValue() // should v be inferred to Int or String?
甚至没有指定返回types明确地解决了这个问题:
val v: Int = getValue()
因为getValue()
首先被评估,而不知道返回值将被分配的位置。
所以,最好的选择是为其中一个function选择不同的名称。
客户应该如何指定他真正想要从class级实例中获得哪个值? 这些方法名称是不明确的。
看方法签名,只有返回types不同,这是不够的。
Java 重载方法的规则也适用于Kotlin:
重载的方法通过传递给方法的参数的数量和types来区分 。
在你的情况下,只要给出适当的区分名称。 如果你的类没有需要显式地定义默认的getter,你也可以简单地创建这些值属性。
inline fun getValue(): T = when (T::class) { Int::class -> 42 as T String::class -> "foo" as T else -> throw IllegalArgumentException() }
你可以使用通用的内联函数和一个具体化的types参数。 给定的代码块在每次调用时都内联。
缺点是编译器不能检查错误的types参数。 你会得到一个IllegalArgumentException
。