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

Measured库中泛型类型无法解析,如何传递类型信息?

Measured库泛型类型解析问题

场景说明

定义Conduit类,通过泛型参数U建模传输不同物理量的管道,尝试汇总所有输入管道的总流量:

class Conduit<U : Units>(
    val flowRate: Measure<UnitsRatio<U, Time>>,
    val inputs: List<Conduit<U>> = emptyList()
) {
    fun test(): Measure<UnitsRatio<U, Time>> {
        return inputs.sumOf { it.flowRate }
    }
}

自定义sumOf实现

为实现求和逻辑,编写了sumOf扩展函数,依赖zero()函数获取初始零值:

val SUnits: Units? = null
inline fun <T, reified U : Units> Collection<T>.sumOf(selector: (T) -> Measure<U>): Measure<U> {
    var sum: Measure<U> = SUnits.zero()
    for (element in this) {
        sum += selector(element)
    }
    return sum
}

zero()函数逻辑

zero()通过检查泛型U的类型,返回对应物理单位的零值:

inline fun <reified U : Units> Units?.zero(): Measure<U> {
    return when (typeOf<U>()) {
        typeOf<Energy>() -> 0.0 * (joules as U)
        typeOf<Volume>() -> 0.0 * (liters as U)
        typeOf<Time>() -> 0.0 * (seconds as U)
        typeOf<UnitsRatio<Energy, Time>>() -> 0.0 * (watts as U)
        typeOf<UnitsRatio<Volume, Time>>() -> 0.0 * ((liters / seconds) as U)
        else -> throw RuntimeException()
    }
}

问题现象

执行以下测试代码时,程序抛出RuntimeException,无法识别UnitsRatio<Energy, Time>类型:

Conduit(
    flowRate = 1 * watts, // 类型为Measure<UnitsRatio<Energy, Time>>
    inputs = listOf(
        Conduit(flowRate = 1 * watts),
        Conduit(flowRate = 1 * watts)
    )
).test().also { println(it) }

推测是类型擦除导致泛型类型信息丢失,需找到传递泛型类型信息的方法,正确初始化求和累加器。


内容的提问来源于stack exchange,提问作者Altline

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:25:13