Kotlin为什么不能有条件地控制重载方法?

xqkwcwgp  于 2023-05-23  发布在  Kotlin
关注(0)|答案(2)|浏览(169)

我认为这在理论上是可行的,我已经花了很多时间来做这件事。
下面是我的代码的一个例子。

//code sample
fun sample(s1:String){
    //...
}

fun sample(i1:Int){
    //...
}

// I want to...

val str = "Hello"
val i = 00865

sample(if (str != "Hello") i else str)
rdrgkggo

rdrgkggo1#

调用哪个方法是在编译代码时确定的。您正在尝试在运行时确定方法。
在你的代码中,由于这两种类型不兼容(String和Int),编译器假设类型是Any--因此没有有效的方法供它调用--所以它不会编译。
下面的例子可能会使它更清楚:

fun sample(n: Int) {
    println("$n is Int")
}

fun sample(n: Number) {
    println("$n is Number")
}

fun callSample() {
    val a: Int = 4
    val b: Number = a

    sample(a)
    sample(b)
}

即使向两个方法传递了相同的数字(4),输出也将是:

4 is Int
4 is Number

因为编译器使用变量的类型来确定方法。

lg40wkob

lg40wkob2#

Kotlin是一种静态类型语言;即,每个表达式必须在编译时评估为特定类型(一个且仅一个)。
sample(if (str != "Hello") i else str)
这里,条件是Kotlin中的表达式,它应该产生一个类型,但如何产生?

  • if分支返回int(i),
  • else分支返回一个String(str)。

这是两种不同的类型但编译器足够聪明,可以将两者都视为Any类型,并向您发出警告:

“Int/String类型的条件分支结果隐式转换为Any”

注意:每个Kotlin类都有Any作为超类。
但是,这也不会编译,因为您没有接受Any类型的sample方法。
解决这个问题的一种方法是拥有重载版本:

fun sample(a: Any){
   //...
 }

相关问题