Несоответствие типов: предполагаемый тип - это BluetoothDevice?но BluetoothDevice ожидалось - PullRequest
0 голосов
/ 10 апреля 2019

Я знаю, что это очень простая ошибка, но я не могу до конца разобраться в нюансах kotlin, чтобы решить ее.

Я получаю сообщение об ошибке:

Несоответствие типов: предполагаемый тип - это BluetoothDevice? но BluetoothDevice ожидалось

При попытке передать BluetoothDevice как пригодный для продажи

class ScanDevice(var device: BluetoothDevice, var rssi: Int): Parcelable {
   ...
    constructor(parcel: Parcel) : this(
        parcel.readParcelable(BluetoothDevice::class.java.classLoader), <--- here
        parcel.readInt()
    )
    ...

Технически это просто предупреждение, а не ошибка, но я не уверен, что здесь происходит.

Ответы [ 3 ]

2 голосов
/ 10 апреля 2019

Документация для Parcel.readerParcelable() гласит:

Возвращает вновь созданный Parcelable или null, если был записан нулевой объект.

Это означает, что, если бы мы жили в мире Kotlin, тип возвращаемого значения Parcel.readParcelable() был бы T?, а не T (т. Е. Он был бы обнуляемым).

Так как выВы контролируете запись, вы знаете , что она не вернет ноль.Это означает, что вы можете безопасно преобразовать результат в необнуляемый тип, используя оператор !!:

parcel.readParcelable(BluetoothDevice::class.java.classLoader)!!
1 голос
/ 10 апреля 2019

Вместо использования !! вероятно, было бы лучше выполнить нулевой безопасный вызов, как это.

parcel?.let{
    it.readParcelable(BluetoothDevice::class.java.classLoader) 
    it.readInt()
}

Код выполняется только тогда, когда участок не равен нулю. Используйте !! только тогда, когда вы на 100% уверены, что переменная / объект не равна нулю.

1 голос
/ 10 апреля 2019

Это потому, что Parcel.readParcelable обнуляем.Если в Parcel ранее было записано нулевое значение в этой позиции, будет возвращено нулевое значение.В вашем случае, если вы можете гарантировать, что никогда не записываете ноль в Parcel, вы можете просто утверждать, что значение не равно нулю:

constructor(parcel: Parcel) : this(
    parcel.readParcelable(BluetoothDevice::class.java.classLoader)!!,
    parcel.readInt()
)

Это произойдет сбой во время выполнения, если нулевое значение былозаписано в Parcel.

...