首页 > 解决方案 > 可空和不可空参数的相同方法

问题描述

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

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 中的可空值和不可空值,而无需我!!每次都使用可空术语调用它。

我已经尝试添加此答案@JvmName("-name")中提到的注释,但这也不起作用。显然,我也可以将方法名称更改为其他名称,但这只是绕圈子,完全避免了这个问题。

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

标签: kotlin

解决方案


这不起作用的原因很简单,Java 没有 null 安全类型,这意味着这两种方法与 Java 看起来完全一样,而 Kotlin 旨在提供与 Java 尽可能多的互操作性。

但是,如果您多想一下,根本没有理由使用这种功能,因为您可以看到您的第二个方法已经正确处理了所有内容,并添加了 1 if case,即使此功能存在也必须存在,因为编译器会需要知道 value 是否为 null 以知道无论如何要调用哪个方法。

到目前为止,我看到的常见方法是NotNull在您的方法中添加后缀,例如,在您的情况parseNotNull下,如果您不允许为空类型,即使从 Java 调用代码也很明显参数不应该为空。


推荐阅读