繁体   English   中英

Kotlin:Upcast和密封课程

[英]Kotlin: Upcast and sealed classes

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

private lateinit var socket = Option.None 

以下转换是不可能的:

socket = socket.map {
    selectedDevice.createRfcommSocketToServiceRecord(MY_UUID).apply {
    connect()
    }
}

因为套接字的类型是

Option.None

但是如果我将socket变量初始化为

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而是Option 但是,在复杂层次结构案例中指定字段类型时,代码更易读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM