我认为这在理论上是可行的,我已经花了很多时间来做这件事。下面是我的代码的一个例子。
//code samplefun sample(s1:String){ //...}fun sample(i1:Int){ //...}// I want to...val str = "Hello"val i = 00865sample(if (str != "Hello") i else str)
//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)
rdrgkggo1#
调用哪个方法是在编译代码时确定的。您正在尝试在运行时确定方法。在你的代码中,由于这两种类型不兼容(String和Int),编译器假设类型是Any--因此没有有效的方法供它调用--所以它不会编译。下面的例子可能会使它更清楚:
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)}
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 Int4 is Number
4 is Int
4 is Number
因为编译器使用变量的类型来确定方法。
lg40wkob2#
Kotlin是一种静态类型语言;即,每个表达式必须在编译时评估为特定类型(一个且仅一个)。sample(if (str != "Hello") i else str)这里,条件是Kotlin中的表达式,它应该产生一个类型,但如何产生?
if
i
str
这是两种不同的类型但编译器足够聪明,可以将两者都视为Any类型,并向您发出警告:
“Int/String类型的条件分支结果隐式转换为Any”
注意:每个Kotlin类都有Any作为超类。但是,这也不会编译,因为您没有接受Any类型的sample方法。解决这个问题的一种方法是拥有重载版本:
sample
fun sample(a: Any){ //... }
fun sample(a: Any){
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
方法。解决这个问题的一种方法是拥有重载版本: