Kotlin中如何实现支持不同泛型返回的OperationType?
解决方案:用泛型抽象类绑定操作与结果类型
核心思路是给抽象类OperationType添加泛型参数,让每个子类明确自己对应的结果类型,同时用通配符处理队列的多类型存储问题。
1. 重构抽象类为泛型类
先保留你的Resource封装类(假设是结果状态封装),然后把OperationType改成泛型类,将结果类型作为泛型参数与回调绑定:
// 假设你的Resource是这类状态封装类 sealed class Resource<out T> { data class Success<out T>(val data: T) : Resource<T>() data class Error(val message: String) : Resource<Nothing>() object Loading : Resource<Nothing>() } // 泛型抽象类,T为当前操作对应的结果类型 abstract class OperationType<T> { // 回调类型与当前操作的结果类型T绑定 abstract val result: (Resource<T>) -> Unit // 定义操作执行的抽象方法 abstract fun execute() }
2. 子类实现对应具体类型
每个操作子类指定自己的泛型类型,回调自然适配对应结果:
// 蓝牙连接操作:返回String类型结果 class ConnectToBluetoothOperation( override val result: (Resource<String>) -> Unit ) : OperationType<String>() { override fun execute() { // 模拟蓝牙连接逻辑 when (Math.random() > 0.5) { true -> result(Resource.Success("BT-DEVICE-001")) false -> result(Resource.Error("蓝牙设备未找到")) } } } // 蓝牙消息发送操作:返回Int类型结果(发送字节数) class SendMessageToBluetoothOperation( private val content: String, override val result: (Resource<Int>) -> Unit ) : OperationType<Int>() { override fun execute() { // 模拟消息发送逻辑 val sendBytes = content.toByteArray().size result(Resource.Success(sendBytes)) } }
3. 队列存储与执行
用通配符OperationType<*>声明队列,支持存储任意类型的操作;执行时直接调用execute()即可,每个操作的回调已经和自身结果类型绑定:
import java.util.LinkedList import java.util.Queue // 操作队列:支持存储所有OperationType子类 val operationQueue: Queue<OperationType<*>> = LinkedList() // 添加操作到队列 operationQueue.add(ConnectToBluetoothOperation { resource -> when (resource) { is Resource.Success -> println("连接成功,设备ID:${resource.data}") is Resource.Error -> println("连接失败:${resource.message}") Resource.Loading -> println("正在连接蓝牙...") } }) operationQueue.add(SendMessageToBluetoothOperation("Hello Bluetooth") { resource -> when (resource) { is Resource.Success -> println("消息发送完成,共发送${resource.data}字节") is Resource.Error -> println("发送失败:${resource.message}") Resource.Loading -> println("正在发送消息...") } }) // 执行队列中的所有操作 while (operationQueue.isNotEmpty()) { operationQueue.poll()?.execute() }
为什么之前用Any不行?
Kotlin中函数参数是逆变的,(Resource<Any>) -> Unit无法接收(Resource<String>) -> Unit类型的回调——因为前者要求能处理任意Any类型,而后者只能处理String类型,类型不兼容。用泛型绑定后,每个子类的回调类型与自身结果类型强关联,从根源避免了这个问题。
内容的提问来源于stack exchange,提问作者Metropol_Tilkisi
相关产品推荐
相关产品推荐

