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

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

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

  1. //code sample
  2. fun sample(s1:String){
  3. //...
  4. }
  5. fun sample(i1:Int){
  6. //...
  7. }
  8. // I want to...
  9. val str = "Hello"
  10. val i = 00865
  11. sample(if (str != "Hello") i else str)
rdrgkggo

rdrgkggo1#

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

  1. fun sample(n: Int) {
  2. println("$n is Int")
  3. }
  4. fun sample(n: Number) {
  5. println("$n is Number")
  6. }
  7. fun callSample() {
  8. val a: Int = 4
  9. val b: Number = a
  10. sample(a)
  11. sample(b)
  12. }

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

  1. 4 is Int
  2. 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方法。
解决这个问题的一种方法是拥有重载版本:

  1. fun sample(a: Any){
  2. //...
  3. }
展开查看全部

相关问题