我正在尝试创建两个几乎相同的方法,这些方法处理可空和不可空参数的方式略有不同:
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")
批注,但这也不起作用。显然,我也可以将方法名称更改为其他名称,但这只是在回避并完全避免了该问题。
希望这是一种简单的方法,或者至少是一个明智的解决方法。还要感谢当前工作方式背后的原因,以及为什么我应该或不应该这样做。
答案 0 :(得分:1)
原因很简单,Java没有null安全类型,这意味着这两种方法在Java上看起来都是完全相同的,并且Kotlin旨在提供与Java尽可能多的互操作性。
但是,如果您多想一点,就没有理由使用该功能,因为您可以看到您的2nd方法已经可以正确处理所有事情,如果有则加1(即使存在此功能也必须存在)因为编译器将需要知道value是否为null,否则必须知道要调用哪种方法。
到目前为止,我见过的常见方法是在您的方法中添加NotNull
后缀,例如,在您不允许使用可空类型的情况下,您可以使用parseNotNull
,即使这样,从Java调用代码时,很明显该参数不应为null。