如何解决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
}
还是有注释说输入参数是否为null返回类型也为null?
解决方法
通过它的外观,可以通过安全的呼叫来实现您的目标。 假设您具有此功能:
fun Long.toDate(): String =
TIMESTAMP_PATTERN.print(toGregorianDateTime(epoch))
您可以在可为空的long上使用它,如下所示:
myNullableLong?.toDate()
如果long为null,则返回null,否则返回正确的日期。
,问题是,在将kotlin用于JVM时,您必须考虑它在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
上声明扩展名,只要该长为null,就可以在其上调用?.toDate
。就像@llama Boy建议的一样。
这将实现您想要的:
- 输入为空时,输出也将为空
- 当输入不可为空时,输出也将不可为空。
您可以避免问题by using @JvmName
annotation on one of them:
@JvmName("toDateNullable")
fun Long?.toDate() : String? {
// some code
}
fun Long.toDate() : String {
// some code
}
但是我同意其他答案,在大多数情况下,您宁愿仅使用安全呼叫而不是定义单独的Long?.toDate
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。