类型不匹配:推断类型是BluetoothDevice?但BluetoothDevice是预料之中的

问题描述 投票:-1回答:3

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

这在技术上只是一个警告,而不是一个错误,但我不确定这里发生了什么。

android kotlin bluetooth parcelable parcel
3个回答
2
投票

documentation for Parcel.readerParcelable()说:

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

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

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

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

1
投票

这是因为Parcel.readParcelable可以为空。如果Parcel之前在该位置写入了空值,则返回null。在您的情况下,如果您可以保证您永远不会向Parcel写入null,则可以简单地断言该值不为null:

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

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


1
投票

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

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

这仅在parcel不为null时执行代码。只有在100%确定变量/对象不为空时才使用!!

© www.soinside.com 2019 - 2024. All rights reserved.