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
相关产品推荐
相关产品推荐

