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

时间:2019-02-22 17:05:52

标签: kotlin

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

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扩展名)?

1 个答案:

答案 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调用名称为-的方法。这也消除了名称冲突,因为方法在字节码中将具有不同的名称。