[英]Generalize method with nullable arguments and return type
我有一個轉換ByteArray?
的方法ByteArray?
到base64 String?
因此,如果參數為null
,則輸出也將為null
。 這是它的實現:
fun toBase64String(array: ByteArray?): String? = if(array == null) null else
Base64.getEncoder().encodeToString(array)
但是當我傳入不為null的ByteArray
方法時,它返回String?
這是預期的。 有沒有一種使它通用的方法,這樣的用例將是可能的:
val base64 = toBase64String(ByteArray(4))
其中base64
將是String
類型而不是String?
類型String?
由於論點是不能為空的?
我剛剛開始與Kotlin一起工作,可能不知道使它成為可能的語言功能。
您可以進行兩個重載,一個重載可為空的ByteArray?
一個用於非null ByteArray
:
fun toBase64String(array: ByteArray): String =
Base64.getEncoder().encodeToString(array)
@JvmName("toBase64StringNullable")
fun toBase64String(array: ByteArray?): String? =
if (array == null) null else toBase64String(array)
我們需要@JvmName("...")
以避免字節碼中的聲明沖突。 而且,這允許區分Java中的功能。
用法:
val nonNullBytes: ByteArray = TODO()
val nonNullString = toBase64String(nonNullBytes) // the inferred type is String
val nullableBytes: ByteArray? = TODO()
val nullableString = toBase64String(nullableBytes) // the inferred type is String?
當參數為非null類型ByteArray
,編譯器將選擇返回非null String
的重載。
可能的重載方法是針對您的情況的最佳解決方案,但是出於完整性考慮,這里還有另外兩種方法可以實現僅使用一種方法(可為空的方法):
非空聲明運算符:
val base64: String = toBase64String(ByteArray(4))!!
Evlis運算符:
val base64: String = toBase64String(ByteArray(4)) ?: "defaultString"
如果參數為null,則輸出也將為null
如果那是函數遇到null參數時唯一要做的事情,那么最好聲明它接受非null值並使用安全調用來處理null:
fun toBase64String(array: ByteArray): String =
Base64.getEncoder().encodeToString(array)
val bytes: ByteArray? = ...
val base64 = bytes?.let { toBase64String(it) }
// the same can be written with function reference instead of lambda
val base64 = bytes?.let(::toBase64String)
在這里, let
函數僅在bytes
不為null時被調用,否則表達式的結果為null
。 調用時,它將調用lambda函數或作為其參數指定的函數引用,並將已檢查為不為null的ByteArray
傳遞給該函數。
將toBase64String
聲明為ByteArray
的擴展也可以更加方便,因此可以通過安全調用來調用它,而無需使用helper函數let
“
fun ByteArray.toBase64String(): String =
Base64.getEncoder().encodeToString(this)
val bytes: ByteArray? = ...
val base64 = bytes?.toBase64String()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.