Kotlin:向上浇铸和密封类

Kotlin:向上浇铸和密封类,kotlin,Kotlin,我正在使用FunKTionale库执行模式匹配。然后,当我初始化变量时,如下所示: private lateinit var socket = Option.None 无法进行以下转换: socket = socket.map { selectedDevice.createRfcommSocketToServiceRecord(MY_UUID).apply { connect() } } 因为插座的类型是 Option.None 但是如果我将套接字变量初始化为 p

我正在使用FunKTionale库执行模式匹配。然后,当我初始化变量时,如下所示:

private lateinit var socket = Option.None 
无法进行以下转换:

socket = socket.map {
    selectedDevice.createRfcommSocketToServiceRecord(MY_UUID).apply {
    connect()
    }
}
因为插座的类型是

Option.None
但是如果我将套接字变量初始化为

private lateinit var socket: Option<BluetoothSocket> = Option.None    
private-lateinit-var-socket:Option=Option.None
map函数可以工作。选项。无对象扩展

Option<Nothing>
选项
并被铸造(在这种情况下)到

选项

那么,这怎么可能呢?

原因是,当您省略字段类型时,将从初始值类型推断出最具体的类型。要声明具有某种不太特定类型的字段,应该显式指定它

假设在您的案例中层次结构如下所示:

Any -> ... -> Option -> Option.None
var socket = Option.None as Option<Socket>
因此,当初始值具有type
Option.None
时,也会推断字段类型,并且字段将无法存储更一般类型的值
Option

要使字段类型成为
选项
或更一般的
任何
,必须明确指定它

更清楚地说,这也适用于您的情况:

Any -> ... -> Option -> Option.None
var socket = Option.None as Option<Socket>
var socket=Option.None作为选项
这里,
Option.None作为Option
的类型不是
Option.None
而是
Option

但是,当您在复杂的层次结构案例中指定字段类型时,代码更具可读性。

我明白了,但是如何将Option(Option.None的类型)强制转换为Option?@JulysPablo,它在类型系统中:正如
Any
是任何其他(不可为null)类型的超级类型,
Nothing
是任何其他类型的子类型。根据这一点,示例代码是有效的:
val lst:List=listOf()
。例如,
throw
表达式的类型为
Nothing
。谢谢@hotkey。我不知道任何东西都不是任何其他类型的子类型