首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建自定义扩展时保留smartcast

创建自定义扩展时保留smartcast
EN

Stack Overflow用户
提问于 2019-08-27 15:51:37
回答 1查看 76关注 0票数 5

我现在不得不写

代码语言:javascript
复制
val myList: List<Int>? = listOf()
if(!myList.isNullOrEmpty()){
    // myList manipulations
}

它将myList智能广播为no非null。以下内容不提供任何智能广播:

代码语言:javascript
复制
if(!myList.orEmpty().isNotEmpty()){
    // Compiler thinks myList can be null here
    // But this is not what I want either, I want the extension fun below
}

if(myList.isNotEmptyExtension()){
    // Compiler thinks myList can be null here
}

private fun <T> Collection<T>?.isNotEmptyExtension() : Boolean {
    return !this.isNullOrEmpty()
}

有没有办法获得自定义扩展的smartCasts?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-27 16:09:51

这是由Kotlin 1.3中引入的contracts解决的。

契约是一种通知编译器某些函数属性的方法,这样它就可以执行一些静态分析,在本例中启用智能强制转换。

代码语言:javascript
复制
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract

@ExperimentalContracts
private fun <T> Collection<T>?.isNotEmptyExtension() : Boolean {
    contract {
       returns(true) implies (this@isNotEmptyExtension != null)
    }
    return !this.isNullOrEmpty()
}

您可以参考isNullOrEmpty的源代码,并查看类似的合同。

代码语言:javascript
复制
contract {
    returns(false) implies (this@isNullOrEmpty != null)
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57670014

复制
相关文章

相似问题

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