[英]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.