gpt4 book ai didi

kotlin - 具有相同名称的并行可空和非空方法

转载 作者:行者123 更新时间:2023-12-02 13:08:41 28 4
gpt4 key购买 nike

我想提供两个具有相同名称的方法,它们可以接受可选或非可选输入:

class Formatter {
fun format(input: Number?) : String? {return number?.toString()}
fun format(input: Number) : String {return number.toString()}
}

显然,由于JVM的限制,这是不可能的:

平台声明冲突:以下声明具有相同的JVM签名(test(Lorg.example.Number;)Ljava / lang / String;):

有没有可读的解决方法可以实现相同的目标?我当前的解决方案是重命名一种方法(例如formatNonNull(input:Number))。

奖励:我的Formatter类实际上是用Java编写的,看起来像这样:
class Formatter {
@Nullable String format(@Nullable Number input) : String {return number != null ? number.toString(): null;}
}

它应通过非null变体扩展:
@NonNull String formatNonNull(@NonNull Number input) : String {return number.toString();}

有没有办法改善这一点,即不引入新名称(例如,使用kotlin扩展名)?

最佳答案

有一个巧妙的技巧可以在JVM上解决此问题:

class Formatter {
fun format(input: Number?) : String? {return number?.toString()}
@JvmName("-formatNonNull") fun format(input: Number) : String {return number.toString()}
}

这样做的原因是 -是JVM字节码中的有效标识符字符,而不是Java语言中的有效标识符字符。这意味着代码将被编译,您将能够在Kotlin中调用这两个方法,但是您将无法从Java调用名称中带有 -的方法。这也消除了名称冲突,因为方法在字节码中将具有不同的名称。

关于kotlin - 具有相同名称的并行可空和非空方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54831964/

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