Kotlin неправильно выводит обнуляемость типа при использовании RxJava2 - PullRequest
0 голосов
/ 28 мая 2018

Я столкнулся с довольно неприятной проблемой, пытаясь запрограммировать фрагмент кода, отвечающий за обнаружение устройств Bluetooth.

Согласно 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 выделяется как «всегда истинно», и возвращаемое значение внезапно становится * 1012.*.Это безумно печально, и я не могу найти решение этой странной проблемы.

Это ошибка в Android Studio или я что-то не так делаю?

1 Ответ

0 голосов
/ 28 мая 2018

Это очень простое объяснение: null значения не поддерживаются в RxJava2.

Использование null выдает NullPointerException во время выполнения, как объяснено здесь: Что отличается в 2.0 .

В вашем конкретном случае IDE выделяет выражение как "всегда истинное", потому что операторы RxJava2 не поддерживают типы, допускающие значения NULL, поэтому он никогда не выдаст один.

...