可空和不可空参数的相同方法

时间:2019-12-22 18:16:42

标签: kotlin

我正在尝试创建两个几乎相同的方法,这些方法处理可空和不可空参数的方式略有不同:

fun parse(type: Any) : MyObject {
    return handleParse(type)
}

fun parse(type: Any?) : MyObject? {
    if (type == null)
        return null

    return handleParse(type)
}

但是我在Android Studio中收到此错误:

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

目标是它会自动在Kotlin中处理可为空和不可为空的值,而无需每次我以可为空的术语调用它时都使用!!

我已经尝试添加this answer中提到的@JvmName("-name")批注,但这也不起作用。显然,我也可以将方法名称更改为其他名称,但这只是在回避并完全避免了该问题。

希望这是一种简单的方法,或者至少是一个明智的解决方法。还要感谢当前工作方式背后的原因,以及为什么我应该或不应该这样做。

1 个答案:

答案 0 :(得分:1)

原因很简单,Java没有null安全类型,这意味着这两种方法在Java上看起来都是完全相同的,并且Kotlin旨在提供与Java尽可能多的互操作性。

但是,如果您多想一点,就没有理由使用该功能,因为您可以看到您的2nd方法已经可以正确处理所有事情,如果有则加1(即使存在此功能也必须存在)因为编译器将需要知道value是否为null,否则必须知道要调用哪种方法。

到目前为止,我见过的

常见方法是在您的方法中添加NotNull后缀,例如,在您不允许使用可空类型的情况下,您可以使用parseNotNull,即使这样,从Java调用代码时,很明显该参数不应为null。