替代function重载

下面的代码

fun getValue(): Int { return 42 } fun getValue(): String { return "Foo" } 

给出以下错误:

有冲突的重载 :本地最终乐趣getValue():在本地最终乐趣中定义的字符串getValue():在main中定义的Int。

有没有办法避免重命名的function之一?

    4 Solutions collect form web for “替代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

    Kotlin language will be the best programming language for Android.