类型不匹配:推断的类型是BluetoothDevice?但是蓝牙设备是预期的

时间:2019-04-10 17:08:26

标签: android kotlin bluetooth parcelable parcel

我知道这是一个非常简单的错误,但是我还不能完全理解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 个答案:

答案 0 :(得分:2)

documentation for Parcel.readerParcelable()说:

  

返回新创建的Parcelable,如果已写入空对象,则返回null

这意味着,如果我们生活在Kotlin世界中,则Parcel.readParcelable()的返回类型将是T?而不是T(即它将为空)。

由于您可以控制写作,因此知道不会返回null。这意味着您可以安全地使用!!运算符将结果转换为非空类型:

parcel.readParcelable(BluetoothDevice::class.java.classLoader)!!

答案 1 :(得分:1)

这是因为Parcel.readParcelable可为空。如果Parcel先前在该位置写入了null值,则将返回null。在您的情况下,如果可以保证永远不会向Parcel写空值,则只需声明该值不为空即可。

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

如果将空值写入Parcel,则会在运行时崩溃。

答案 2 :(得分:1)

而不是使用!!这样执行null安全调用可能会更好。

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

仅当宗地不为null时才执行代码。仅在100%确定变量/对象不为空时,才使用!!