我想提供两种名称相同的方法,它们可以接受可选或非可选输入:
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扩展名)?
答案 0 :(得分:3)
有一个巧妙的方法可以在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调用名称为-
的方法。这也消除了名称冲突,因为方法在字节码中将具有不同的名称。