我知道这是一个非常简单的错误,但是我还不能完全理解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()
)
...
从技术上讲,这只是警告,实际上不是错误,但是我不确定这里发生了什么。
答案 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%确定变量/对象不为空时,才使用!!
。