You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 09:33:08