Kotlin在使用RxJava2时错误地推断了类型的可空性

时间:2018-05-28 10:15:40

标签: android kotlin rx-java2

在尝试编写一段负责发现蓝牙设备的代码时,我遇到了一个非常令人沮丧的问题。

根据Android Studio,这段代码是正确的:

fun discoverDevices(): Observable<BluetoothDevice> {
    val discovered: HashSet<BluetoothDevice> = HashSet()
    return bluetoothUtil.startDiscovery()
            .flatMapObservable { discoveryStarted ->
                if(discoveryStarted) {
                    RxBroadcastReceiver.create(appContext, IntentFilter().apply {
                        addAction(BluetoothDevice.ACTION_FOUND)
                        addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)
                    })
                } else {
                    Observable.error(Throwable("Discovery couldn't be started"))
                }
            }
            .takeUntil { intent ->
                intent.action == BluetoothAdapter.ACTION_DISCOVERY_FINISHED
            }
            .map { intent ->
                var bluetoothDevice: BluetoothDevice? = null
                if(intent.action == BluetoothDevice.ACTION_FOUND) {
                    bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)
                }
                if(bluetoothDevice != null && !discovered.contains(bluetoothDevice))
                    bluetoothDevice
                else
                    null
            }
}

该函数声明它返回Observable<BluetoothDevice>,即使地图函数显然会返回BluetoothDevice?。此外,我尝试通过附加

强制它过滤空值
.filter {
    it != null
}

到链的末尾,条件it != null突出显示为&#34;始终为真&#34;并且返回值突然变为Observable<BluetoothDevice?>。这令人非常沮丧,我似乎无法找到解决这个奇怪问题的方法。

这是Android Studio的错误还是我做错了什么?

1 个答案:

答案 0 :(得分:4)

这有一个非常简单的解释:RxJava2中null

使用null会在运行时抛出NullPointerException,如下所述:What's different in 2.0

在您的特定情况下,IDE会将表达式突出显示为&#34;始终为true&#34;因为RxJava2运营商不支持可空类型,所以它永远不会发出一个。