当前位置: 首页 > 知识库问答 >
问题:

同名并行可空与非空方法

金烨华
2023-03-14

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

class Formatter {
    fun format(input: Number?) : String? {return number?.toString()}
    fun format(input: Number) : String {return number.toString()}
}
class Formatter {
    @Nullable String format(@Nullable Number input) : String {return number != null ? number.toString(): null;}
}

它应由非空变体扩展:

@NonNull String formatNonNull(@NonNull Number input) : String {return number.toString();}

是否有一种方法可以改进这一点,即不引入新的名称(例如使用kotlin扩展)?

共有1个答案

仲孙雅达
2023-03-14

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

 类似资料:
  • 问题内容: 从目前的情况来看,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 在sql数据库列中,除非我们使用指定,否则将将空字段设置为。用一种代替另一种的优点是什么?谢谢! 问题答案: 如果需要在列中表示未知数据,请使其为可为空

  • VS 我习惯了第二种方法,但第一种方法是等价的吗?

  • 大家在使用 Lua 的时候,一定会遇到不少和 nil 有关的坑吧。有时候不小心引用了一个没有赋值的变量,这时它的值默认为 nil。如果对一个 nil 进行索引的话,会导致异常。 如下: local person = {name = "Bob", sex = "M"} -- do something person = nil -- do something print(person.name)

  • 问题内容: 命名空间Python程序包(no )和常规Python程序包(具有)之间有什么区别,尤其是对于常规程序包为空时? 我很好奇,因为最近我一直忘了自己制作的包装,而且我从没发现任何问题。实际上,它们的行为似乎与常规软件包相同。 编辑:命名空间包仅受Python 3.3支持(请参阅PEP 420 ),因此自然地,此问题仅适用于Python 3。 问题答案: 阅读Aaron和PEP420的链接

  • 问题内容: 这是我的xml,需要将其转换为Java。我用过jaxb 并引发以下异常javax.xml.bind.UnmarshalException:意外元素(uri:“ http://www.ae.com/Event/Load ”,本地:“ Order”)。期望的元素是<{} lm:Order> 这是我的解组代码 订购Pojo班 您能否也帮助我阅读,当前正在读取文件,需要读取为XML Strin

  • 尽管 JavaScript 支持一对花括号创建的代码段,但是并不支持块级作用域; 而仅仅支持 函数作用域。 function test() { // 一个作用域 for(var i = 0; i < 10; i++) { // 不是一个作用域 // count } console.log(i); // 10 } 注意: 如果不是在赋值语句中,而是在 ret