首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有可空参数和返回类型的泛化方法

具有可空参数和返回类型的泛化方法
EN

Stack Overflow用户
提问于 2017-08-24 12:45:42
回答 2查看 661关注 0票数 1

我有一个将ByteArray?转换为base64 String?的方法,这样如果参数是null,那么null输出也将是null。这就是它的执行情况:

代码语言:javascript
运行
复制
fun toBase64String(array: ByteArray?): String? = if(array == null) null else 
    Base64.getEncoder().encodeToString(array)

但是,当我传入不可空的ByteArray方法时,会返回预期的String?。是否有一种方法可以使它成为通用的,从而使这种用例成为可能:

代码语言:javascript
运行
复制
val base64 = toBase64String(ByteArray(4))

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

我刚开始使用Kotlin,可能不知道语言特性可以实现这一点。

EN

回答 2

Stack Overflow用户

发布于 2017-08-24 13:05:26

可能重载方法是最好的解决方案,但是为了完整起见,还有另外两种方法可以实现:只使用一种方法(可空的方法):

非零断言操作符:

代码语言:javascript
运行
复制
val base64: String = toBase64String(ByteArray(4))!!

Evlis算子:

代码语言:javascript
运行
复制
val base64: String = toBase64String(ByteArray(4)) ?: "defaultString"
票数 2
EN

Stack Overflow用户

发布于 2017-08-26 15:54:57

如果参数为空,输出也将为空。

如果这是函数在遇到空参数时所做的唯一事情,最好声明它接受非空值,并使用安全调用来处理空值:

代码语言:javascript
运行
复制
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函数不是null时才调用bytes函数,否则表达式的结果是null。当被调用时,它将调用lambda函数或作为其参数指定的函数引用,将已被检查为非空的ByteArray传递给该函数。

另外,将toBase64String声明为ByteArray的扩展也更方便,因此可以在不使用助手函数let的情况下使用安全调用来调用它。“

代码语言:javascript
运行
复制
fun ByteArray.toBase64String(): String =   
    Base64.getEncoder().encodeToString(this)

val bytes: ByteArray? = ...
val base64 = bytes?.toBase64String()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45862036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档