我正在使用FunKTionale库来执行模式匹配.然后,当我初始化变量时,如下所示:
private lateinit var socket = Option.None
Run Code Online (Sandbox Code Playgroud)
以下转换是不可能的:
socket = socket.map {
selectedDevice.createRfcommSocketToServiceRecord(MY_UUID).apply {
connect()
}
}
Run Code Online (Sandbox Code Playgroud)
因为套接字的类型是
Option.None
Run Code Online (Sandbox Code Playgroud)
但是如果我将socket变量初始化为
private lateinit var socket: Option<BluetoothSocket> = Option.None
Run Code Online (Sandbox Code Playgroud)
地图功能有效.Option.None对象扩展
Option<Nothing>
Run Code Online (Sandbox Code Playgroud)
并被铸造(在这种情况下)
Option<BluetoothSocket>
Run Code Online (Sandbox Code Playgroud)
那么,这怎么可能呢?
原因是当您省略字段类型时,从初始值类型推断出最具体的类型.要声明具有较少特定类型的字段,应明确指定它.
假设在您的情况下层次结构如下所示:
Any -> ... -> Option -> Option.None
Run Code Online (Sandbox Code Playgroud)
因此,当初始值具有类型时Option.None,也会推断字段类型,并且该字段将无法存储更一般类型的值Option.
要使字段类型Option或更通用的内容,Any您必须明确指定它.
为了更清楚,这也适用于您的情况:
var socket = Option.None as Option<Socket>
Run Code Online (Sandbox Code Playgroud)
在这里,类型Option.None as Option<Socket>是不是Option.None,但Option.但是,在复杂层次结构案例中指定字段类型时,代码更易读.
| 归档时间: |
|
| 查看次数: |
713 次 |
| 最近记录: |