gpt4 book ai didi

kotlin - 如何重载具有相同参数类型但可以为空的函数

转载 作者:行者123 更新时间:2023-12-01 11:16:23 25 4
gpt4 key购买 nike

我正在尝试向 Calendar 添加两个扩展函数Android 中的类将特定的日期时间模式转换为日历,反之亦然

fun Calendar.fromIsoString(date: String): Calendar = this.apply {
time = SimpleDateFormat(SERVER_DATE_PATTERN, Locale.US).parse(date)
}

fun Calendar.fromIsoString(date: String?): Calendar? {
if (date == null) return null
time = SimpleDateFormat(SERVER_DATE_PATTERN, Locale.US).parse(date)
return this
}

但它给了我以下错误:

Platform declaration clash: The following declarations have the same JVM signature (fromIsoString(Ljava/util/Calendar;Ljava/lang/String;)Ljava/util/Calendar;)



是否可以同时拥有这两个功能?如何?

笔记:
我通过添加 Unit 以某种方式处理了这个问题。函数之一的可选参数:
fun Calendar.fromIsoString(date: String?, a: Unit = Unit): Calendar? {
if (date == null) return null
time = SimpleDateFormat(SERVER_DATE_PATTERN, Locale.US).parse(date)
return this
}

但我认为这很棘手,不是一个好习惯!
有没有更好的解决办法?

最佳答案

有一个简单的解决方案可以让您在不更改方法或要从 Kotlin 中调用它们的名称的情况下执行此操作。

对于 Kotlin 而言,这两种方法之间的区别很明显,但对于 JVM 而言则不然。因此,只需告诉 Kotlin 您想要一个完全不会影响 Kotlin 代码的方法的不同内部 JVM 名称。只有 Java 代码会看到替代名称。例如:

fun Calendar.fromIsoString(date: String): Calendar = this.apply {
// ... your code without change
}

@JvmName("fromIsoStringNullable") // <-- this solves your problem without changing the name in Kotlin
fun Calendar.fromIsoString(date: String?): Calendar? {
// ... your code without change
}

瞧!没有更多的错误!您可以使用相同的名称从 Kotlin 调用任一版本 someCalendar.fromIsoString(...)
其他表明可空性是语法糖的答案和评论远非正确。这些类型作为额外的元数据写入字节码,只有 Kotlin 才能看到和执行。但除此之外,它还添加了一个 @Nullable参数的注释。实际上,所有 Kotlin 生成的函数参数都有 @NotNull@Nullable字节码中的注释供其他语言或分析器查看和执行,如果他们足够关心的话。

关于kotlin - 如何重载具有相同参数类型但可以为空的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50485573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com