簡體   English   中英

kotlin 中的條件可空返回類型

[英]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 建議的那樣。

這將實現您想要的:

  1. 當輸入可以為空時,輸出也可以為空
  2. 當輸入不可為空時,輸出也不可為空。

您可以通過在其中之一上使用@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM