2017-08-24 24 views
1

我有一個轉換ByteArray?的方法爲Base64 String?因此,如果論點是null輸出將null爲好。這是它的實現:期廣義方法可空參數和返回類型

fun toBase64String(array: ByteArray?): String? = if(array == null) null else 
    Base64.getEncoder().encodeToString(array) 

但是當我通過在不可爲空ByteArray方法返回String?預計。有沒有辦法讓它通用的,所以這種情況下的使用將是可能的:

val base64 = toBase64String(ByteArray(4)) 

其中base64String型的,而不是因爲String?論點不可爲空?

我剛開始與Kotlin一起工作,可能不知道可以使這成爲可能的語言功能。

回答

4

你可以讓兩個重載,一個爲空的ByteArray?,一個用於非空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? 

當參數爲非空型ByteArray,編譯器會選擇返回一個非空String過載。

+0

哦調用,我試圖添加重載方法,但沒有不是由於聲明衝突造成的。感謝您指向'@ JvmName'註釋! – klappvisor

2

可能重載方法爲您的情況最好的解決辦法,但爲了完整起見這裏有另外兩種方式來實現,使用只有一個方法(可爲空的一個):

不是無效斷言操作:

val base64: String = toBase64String(ByteArray(4))!! 

Evlis操作:

val base64: String = toBase64String(ByteArray(4)) ?: "defaultString" 
1

如果參數爲空輸出將是空的,以及

如果是這樣的功能呢,當它遇到空的說法,這是更好地宣佈它接受非空值和使用安全的呼叫處理空值的唯一的事情:

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。調用它時,會調用lambda函數或指定的函數引用作爲它的參數,並將已經檢查爲ByteArrayByteArray傳遞給該函數。

此外,它可以更方便地宣佈toBase64String作爲擴展爲ByteArray,因此它可以提供安全的呼叫沒有輔助函數let

fun ByteArray.toBase64String(): String = 
    Base64.getEncoder().encodeToString(this) 

val bytes: ByteArray? = ... 
val base64 = bytes?.toBase64String() 
相關問題