Kotlin列表的扩展函数

4

我有一个下面展示的扩展函数

infix fun List<Int>.sumList(that: List<Int>) =
    this.zip(that, Int::plus)

我现在正在尝试将这个扩展函数泛型化,使它可以处理整数、浮点数和双精度数的列表。

listOf(1,2,3).sumList(listOf(10,20,30)) 将给出 [11, 22, 33]

以下是我尝试使用泛型编写相同扩展函数的代码:

inline infix fun <reified T: Number> List<T>.sumListNew(that: List<T>): List<T> = when {
    T is Double -> this.zip(that, Double::plus)
    else -> this.zip(that, Int::plus)
}

然而,在 T 处,我遇到了编译器错误,显示类型参数不是表达式。有人能帮我解决这个错误并说明产生该错误的原因吗?

如果您最终仍然需要为每个子类型提供单独的实现,那么制作此函数通用化的意义何在?我认为最好只创建多个重载。 - broot
1
@broot 可能有一个值得商榷的原因是,这样你就可以只有一个 sum 方法,而不是 sumIntssumDoubles 等等。虽然这也可以通过使用 @JvmName("sumInts")@JvmName("sumDoubles") 等方式来解决。 - Slaw
3
我认为你需要这样做:when(T::class) { Double::class -> (this as List<Double>).zip(that as List<Double>, Double::plus) as List<T>。这会生成很多常规代码,但我仍然认为你应该使用重载并且在需要时加上 @JvmName 注解。无论如何,这个函数从 Java 中也无法使用。 - broot
1个回答

2
也许你可以通过编写一个总和方法并仅重载数字的加号运算符来实现此操作:
operator fun Number.plus(a : Number) : Number{
    return when(this::class){
        Int::class -> this.toInt() + a.toInt()
        Double::class -> this.toDouble() + a.toDouble()
        else -> error("Data Type not found!")
    }
}

inline infix fun <reified T: Number> List<T>.sumListNew(that: List<T>): List<T>{
    return this.zip(that,Number::plus) as List<T>
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接