//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)
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)
}
2条答案
按热度按时间rdrgkggo1#
调用哪个方法是在编译代码时确定的。您正在尝试在运行时确定方法。
在你的代码中,由于这两种类型不兼容(String和Int),编译器假设类型是
Any
--因此没有有效的方法供它调用--所以它不会编译。下面的例子可能会使它更清楚:
即使向两个方法传递了相同的数字(4),输出也将是:
因为编译器使用变量的类型来确定方法。
lg40wkob2#
Kotlin是一种静态类型语言;即,每个表达式必须在编译时评估为特定类型(一个且仅一个)。
sample(if (str != "Hello") i else str)
这里,条件是Kotlin中的表达式,它应该产生一个类型,但如何产生?
if
分支返回int(i
),str
)。这是两种不同的类型但编译器足够聪明,可以将两者都视为
Any
类型,并向您发出警告:“Int/String类型的条件分支结果隐式转换为Any”
注意:每个Kotlin类都有
Any
作为超类。但是,这也不会编译,因为您没有接受
Any
类型的sample
方法。解决这个问题的一种方法是拥有重载版本: