Kotlin:向上和密封的课程

我正在使用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 

地图功能起作用。 Option.None对象扩展

 Option<Nothing> 

并被铸造(在这种情况下)

 Option<BluetoothSocket> 

那么,这怎么可能?

原因是当你省略字段类型时,最具体的类型是从初始值类型推断出来的。 要声明一个不太具体的类型的字段,应该明确指定它。

假设你的情况下层次结构如下所示:

 Any -> ... -> Option -> Option.None 

因此,当初始值的类型为Option.None ,也会为字段类型推断,并且该字段将无法存储更一般类型的Option

为了使字段类型的Option或更一般的东西Any你必须明确指定。

为了更清楚地说明,这也适用于你的情况:

 var socket = Option.None as Option<Socket> 

这里, Option.None as Option<Socket>类型Option.None as Option<Socket>不是Option.None而是Option 。 但是,在指定复杂层次结构案例中字段的类型时,代码更具可读性。