Kotlin:不能同时应用两个条件检查"返回体"功能样式

K.O*_*.Os 4 kotlin kotlin-null-safety

我有一个简单的功能检查,如下所示:

    fun parseValidBluetoothBrickedId(controllerId: String?): Boolean{
    if(controllerId != null){
        if(controllerId.startsWith(BLUETOOTH_NAME_PREFIX) && controllerId.length > BLUETOOTH_NAME_PREFIX.length)
            return true
    }

    return false
}
Run Code Online (Sandbox Code Playgroud)

我想将它转换为更简单的风格:

   fun parseValidBluetoothBrickedId(controllerId: String?) =
        controllerId?.length > BLUETOOTH_NAME_PREFIX.length
      &&  controllerId?.startsWith(BLUETOOTH_NAME_PREFIX)
Run Code Online (Sandbox Code Playgroud)

但IDE(Android Studio 3.0 Beta7)给我一个错误,强调大于('>')运算符:

操作员调用对应于点限定调用'controllerId?.length.compareTo(BLUETOOTH_NAME_PREFIX.length),此处不允许

它还强调为错误行controllerId?.startsWith(BLUETOOTH_NAME_PREFIX)并说:

类型不匹配.必需:Boolean,Found Boolean?

有什么问题,真的吗?它只是一个简单的方法,适用于第一个块if-else风格.

zsm*_*b13 7

您不能调用compareTo(使用<运算符)controllerId?.length,因为它的类型是Int?,这意味着它可能是null,在这种情况下,它不能作为数字进行比较.

类似地,controllerId?.startsWith(BLUETOOTH_NAME_PREFIX)调用返回Boolean?(因为它将返回,null如果controllerIdnull),它不能传递给&&运算符,只有真正的Boolean可以.

这里的解决方案是null检查您在原始方法中执行的操作,并依靠智能转换controllerId来摆脱安全调用String:

fun parseValidBluetoothBrickedId(controllerId: String?): Boolean =
        controllerId != null 
        &&  controllerId.length > BLUETOOTH_NAME_PREFIX.length
        &&  controllerId.startsWith(BLUETOOTH_NAME_PREFIX)
Run Code Online (Sandbox Code Playgroud)