代码之家  ›  专栏  ›  技术社区  ›  Roland

Kotlin类型擦除-为什么只有泛型类型不同的函数是可编译的,而只有返回类型不同的函数是不可编译的?

  •  3
  • Roland  · 技术社区  · 7 年前

    在工作的时候 answer How does erasure work in Kotlin? 我发现了一些我还不明白的事情,也没有找到任何来源为什么会这样。

    fun bar(foo: List<*>) = ""
    fun bar(foo: List<*>) = 2
    

    而下面是什么?

    fun bar(foo: List<String>) = ""
    fun bar(foo: List<Int>) = 2
    

    fun bar(foo: List<*>) = ""
    fun <T> bar(foo: List<*>) = 2 // T isn't even used
    

    因为最后一个根本没用 T 如我们所知,泛型在运行时被删除,为什么这一个可以工作,而没有泛型类型的变量不能?

    在字节码中,只允许返回类型不同的方法(已在 above linked answer

    欢迎任何提示、来源和/或参考。

    补充 this question now also at discuss.kotlinlang.org

    1 回复  |  直到 7 年前
        1
  •  3
  •   yole    7 年前

    这些函数编译或不编译的原因与Kotlin的重载解析规则有关。Kotlin不使用所需的类型来解析重载,因此在调用此函数时:

     val x = bar(listOf(""))
    

    …Kotlin编译器无法确定类型,也不允许您通过指定 x 明确地。