[英]Conditional nullable return type in kotlin
我写了一些代码,而且工作正常!
public fun toTimeStamp(epoch: Long?): String? = when (epoch) {
null -> null
else -> toTimeStamp(epoch)
}
public fun toTimeStamp(epoch: Long): String =
TIMESTAMP_PATTERN.print(toGregorianDateTime(epoch))
但是当我将它转换为扩展功能时,它不起作用。 编译器说方法名称重复。
我需要这样的东西:
fun Long?.toDate() : String? {
// some code
}
fun Long.toDate() : String {
// some code
}
或者是否有注释说明输入参数是否为空,返回类型是否也为空?
从表面上看,您的目标可以通过安全调用来实现。 假设你有这个功能:
fun Long.toDate(): String =
TIMESTAMP_PATTERN.print(toGregorianDateTime(epoch))
您可以在可空的 long 上使用它,如下所示:
myNullableLong?.toDate()
如果 long 为 null,则返回 null,否则返回正确的日期。
问题在于,在 JVM 中使用 kotlin 时,您必须考虑这在 JVM 中的外观。 你的方法:
fun Long?.toDate() : String? {
// some code
}
fun Long.toDate() : String {
// some code
}
在 Java 中相当于:
public static @Nullable String toDate(@Nullable Long receiver) {}
public static @NonNull String toDate(long receiver) {}
不幸的是,在 Java 中,注解并不能解决声明的歧义(无论是返回类型),所以本质上这些方法是相同的,这就是编译器抱怨的原因。
就像已经提到的一些一样,您很可能只能使用安全调用。
在Long
上声明一个扩展,只要这个 long 可以为空,就调用?.toDate
就可以了。 就像@llama Boy 建议的那样。
这将实现您想要的:
您可以通过在其中之一上使用@JvmName
注释来避免该问题:
@JvmName("toDateNullable")
fun Long?.toDate() : String? {
// some code
}
fun Long.toDate() : String {
// some code
}
但我同意其他答案,在大多数情况下,您可以更喜欢只使用安全调用而不是定义单独的Long?.toDate
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.