gpt4 book ai didi

Kotlin 类型删除 - 为什么仅泛型类型不同的函数可编译,而仅返回类型不同的函数则不可编译?

转载 作者:行者123 更新时间:2023-12-02 11:36:46 24 4
gpt4 key购买 nike

在处理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 .

最佳答案

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

 val x = bar(listOf(""))

...Kotlin 编译器无法确定类型,并且它不允许您通过显式指定 x 的类型来消除调用的歧义。

在第二种情况下,不存在重载解析问题,因为函数具有不同的参数类型,并且不存在 JVM 名称冲突问题,因为函数具有不同的返回类型(因此具有不同的删除签名)。因此,代码可以编译。

关于Kotlin 类型删除 - 为什么仅泛型类型不同的函数可编译,而仅返回类型不同的函数则不可编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52092214/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com