gpt4 book ai didi

generics - 我对同一个类有两个 Kotlin 扩展方法,但是具有不同的通用签名并且编译器会提示

转载 作者:IT老高 更新时间:2023-10-28 13:31:40 31 4
gpt4 key购买 nike

我正在为同一个类编写两个扩展函数:

class Something<T:Any> { ... }

它们看起来像:

fun Something<Int>.toJson(): String = ...
fun Something<Double>.toJson(): String = ...

并导致编译错误:

Kotlin: Platform declaration clash: The following declarations have the same JVM signature

如何创建两个只有泛型签名不同的扩展函数?还是不可能?

注意: 这个问题是作者有意编写和回答的( Self-Answered Questions ),因此常见的 Kotlin 主题的答案出现在 SO 中。它起源于Kotlin slack #通用 channel 。

最佳答案

Kotlin 有 @JvmName annotation专门针对这种类型的用例。在 Kotlin 中,没有问题,因为它知道方法之间的区别。但是 Java 兼容的字节码会有命名冲突,因为泛型删除签名是相同的。

因此需要使用这个注解从Java和JVM的角度来控制名称。您的 Kotlin 代码将看不到此替代名称,而是按照您的意图使用该名称。

将您的代码更改为:

@JvmName("somethingIntToJson") fun Something<Int>.toJson(): String = ...
@JvmName("somethingDoubleToJson") fun Something<Double>.toJson(): String = ...

来自 Kotlin,正常使用:

val someIntyThing = Something<Int>(194)
val json = someIntyThing.toJson()

关于generics - 我对同一个类有两个 Kotlin 扩展方法,但是具有不同的通用签名并且编译器会提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35579828/

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