Kotlin 对于可为null和不可为null的参数,使用相同的方法

Kotlin 对于可为null和不可为null的参数,使用相同的方法,kotlin,Kotlin,我尝试创建两个几乎相同的方法,它们处理可为null的参数和不可为null的参数的方式略有不同: fun parse(type: Any) : MyObject { return handleParse(type) } fun parse(type: Any?) : MyObject? { if (type == null) return null return handleParse(type) } 但我在Android Studio中遇到了这个错误

我尝试创建两个几乎相同的方法,它们处理可为null的参数和不可为null的参数的方式略有不同:

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”)
注释,但也不起作用。显然,我也可以将方法名称更改为其他名称,但这只是绕圈子,完全避免了这个问题


希望有一个简单的方法来做这件事,或者至少有一个合理的解决办法。我也很欣赏当前工作方式背后的原因,以及我应该或不应该这样做的原因。

这不起作用的原因很简单,Java没有空安全类型,这意味着这两种方法在Java看来完全相同,Kotlin的目标是尽可能提供与Java的互操作性

但如果您想得更清楚一点,就没有理由使用这种特性,因为您可以看到您的第二个方法已经正确地处理了所有事情,添加了1 if case,即使这个特性存在,也必须存在,因为编译器需要知道值是否为null,才能知道调用哪个方法


到目前为止,我所看到的常用方法是在方法中添加
NotNull
后缀,例如,在您的情况下,如果您不允许可为null的类型,它将是
parseNotNull
,这样即使在从Java调用代码时,参数也显然不应该为null。

“没有理由使用这种特性。”:事实上,我想有。尽管可为null的版本处理所有情况,但它返回一个可为null的结果——强制调用方处理null,即使调用方(通过传递一个不可为null的参数)知道结果永远不能为null。函数的不可为空版本不存在此问题。但当然,不可为空的版本并不能处理所有情况。看来这两个版本都有原因使用
…NotNull
后缀似乎是一种清晰且合乎逻辑的方法。有什么不适用于
@JvmName