这两个Kotlin扩张函数有什么不同吗?

fun Any?.f(o: Any?) = 100

fun <T> T.g(o: T) = 100

是否有可能以这样一种方式重写g,使其参数类型和接收器类型强制相同?

也就是说,10.g(5)"x".g("y")可以,但10.g("y")不能编译.

编辑: 给出this个,我想我第二个问题的答案是否定的,没有一个增加了额外的论点.

推荐答案

我认为在 compose 本答案(Kotlin 1.7.20)时,官方还不可能做到这一点.

然而,在内部,Kotlin编译器支持这种情况,它允许更改默认行为并使用精确的类型参数.这由内部的@Exact注释控制,并且在整个Kotlin stdlib中的许多地方使用.

通过一些黑客攻击,我们可以在自己的代码中启用此行为:

@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
fun <T> @kotlin.internal.Exact T.g(o: @kotlin.internal.Exact T) = 100

当然,这纯粹是一次黑客攻击,它可能会在future 的Kotlin版本中停止工作.

Update

回答你的第一个问题,即使用AnyT是否有区别.如果类型参数不仅被使用,而且还被进一步传递,则泛型函数最有意义.例如,如果函数返回T或它接收到一个使用T的对象:

fun main() {
    var result = 5.g(7)
}

fun <T> T.g(o: T): T = if (...) this else o

在本例中,result的类型为Int.如果我们使用Any而不是T,那么result也必须是Any.

Kotlin相关问答推荐

Groovy Gradle文件的Kotlin类似功能

Scala与Kotlin中的迭代

垂直滚动条下拉菜单的桌面组合

kotlin 模式匹配如何像 scala 一样工作

如何在 jOOQ 中两次加入同一张表?

如何将glide显示的图像下载到设备存储中.Kotlin

kotest 更改环境变量

为什么 KFunction2 在 Kotlin 中不是可表示类型?

如何在 Hibernate Panache 中进行部分搜索

是否可以通过超时暂停协程?

listOf() 返回 MutableList

基类中的 ViewModelProviders.get(...)

如何在MVVM架构中观察RecyclerView适配器中的LiveData?

哪里可以找到aapt2日志(log)?

生成Kotlin类图

在Kotlin中为Android编写库会有开销吗?

将字符串转换为HashMap的最简单方法

Android Kotlin .visibility

Android studio 4.0 新更新版本说 Kotlin 与这个新版本不兼容

使用 Moshi/Retrofit2 访问深度嵌套的 JSON 数组