具有可空参数和返回类型的通用方法

kla*_*sor 1 kotlin

我有一个转换ByteArray?为base64 的方法,String?因此,如果null输出了参数,也会这样null。这是它的实现:

fun toBase64String(array: ByteArray?): String? = if(array == null) null else 
    Base64.getEncoder().encodeToString(array)
Run Code Online (Sandbox Code Playgroud)

但是当我传入不为null的ByteArray方法时String?,会返回预期的结果。有没有一种使它通用的方法,这样的用例将是可能的:

val base64 = toBase64String(ByteArray(4))
Run Code Online (Sandbox Code Playgroud)

哪里base64是类型,String而不是String?因为参数不可为空?

我刚刚开始与Kotlin一起工作,可能不知道使它成为可能的语言功能。

hot*_*key 6

您可以进行两个重载,一个重载可为空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)
Run Code Online (Sandbox Code Playgroud)

我们需要@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?
Run Code Online (Sandbox Code Playgroud)

当参数为非null类型时ByteArray,编译器将选择返回非null的重载String