gpt4 book ai didi

Kotlin:Upcast 和 sealed 类

转载 作者:行者123 更新时间:2023-12-01 11:28:53 26 4
gpt4 key购买 nike

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

private lateinit var socket = Option.None 

下面的转换是不可能的:

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

因为socket的类型是

Option.None

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

private lateinit var socket: Option<BluetoothSocket> = Option.None    

map 功能有效。 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 .但是,当您在复杂层次结构的情况下指定字段类型时,代码更具可读性。

关于Kotlin:Upcast 和 sealed 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34976847/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com