我知道这是一个非常简单的错误,但我还不能完全理解kotlin的细微差别,足以解决它。
我收到错误:
类型不匹配:推断类型是BluetoothDevice?但BluetoothDevice是预料之中的
当试图传递BluetoothDevice
作为parpelable
class ScanDevice(var device: BluetoothDevice, var rssi: Int): Parcelable {
...
constructor(parcel: Parcel) : this(
parcel.readParcelable(BluetoothDevice::class.java.classLoader), <--- here
parcel.readInt()
)
...
这在技术上只是一个警告,而不是一个错误,但我不确定这里发生了什么。
documentation for Parcel.readerParcelable()
说:
如果已写入空对象,则返回新创建的
Parcelable
或null
。
这意味着,如果我们生活在Kotlin世界,Parcel.readParcelable()
的返回类型将是T?
而不是T
(即它可以为空)。
由于您可以控制写入,因此您知道它不会返回null。这意味着您可以使用!!
运算符将结果转换为非可空类型:
parcel.readParcelable(BluetoothDevice::class.java.classLoader)!!
这是因为Parcel.readParcelable
可以为空。如果Parcel
之前在该位置写入了空值,则返回null。在您的情况下,如果您可以保证您永远不会向Parcel
写入null,则可以简单地断言该值不为null:
constructor(parcel: Parcel) : this(
parcel.readParcelable(BluetoothDevice::class.java.classLoader)!!,
parcel.readInt()
)
如果将空值写入Parcel
,这将在运行时崩溃。
而不是使用!!像这样执行空安全调用可能会更好。
parcel?.let{
it.readParcelable(BluetoothDevice::class.java.classLoader)
it.readInt()
}
这仅在parcel不为null时执行代码。只有在100%确定变量/对象不为空时才使用!!
。