替代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" 

但是,这仍然不能解决您的问题。 既然你没有给我们提供任何信息, 为什么你需要这样的声明,我只能给你一些建议:

  1. 为值以外的其他variablesfind更有意义的名称。 例如:

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

     val value get() = 42 to "Foo" 

    现在,您可以通过value.firstvalue.second访问这两个值。 请注意, to创建Pair的中缀函数 ,上面相当于更详细的表示法

     val value : Pair get() = Pair(42, "Foo") 
  3. 如果value是值得存储在自己的对象,而不是使用一个Pair ,你可以创建自己的数据类:

     data class MyData(val intVal : Int, val textVal : Text) val value get() = MyData(42, "Foo") 

通过解决方案23 ,可以使用解构声明 ,如下所示:

 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