我有一个如下所示的扩展函数

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

我现在试图使这个扩展函数泛化,以便它可以处理整数列表以及浮点和double.

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

下面是我使用泛型编写相同扩展函数的try

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处得到编译器错误,说类型参数不是表达式.

推荐答案

也许您可以通过使用一个求和方法并只重写Number的加号运算符来实现这一点:

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>
}

Kotlin相关问答推荐

这些Kotlin函数等效吗?

多模块Kotlin项目中的FreeFair

Kotlin扩展函数未调用Hibernate/JPA中的重写函数

Gradle:无法创建 ExtensiblePolymorphicDomainObjectContainer

内容更改后的 var 重新计算

如何在 kotlin 中使用带有泛型的密封类

kotlin 单例异常是好是坏?

使用纯 Kotlin 函数作为 Junit5 方法源

在 SplashActivity 中显示的 Firebase 应用内消息.如何在 MainActivity 中显示它?

Android 在将 androidx 生物识别更新为 1.0.0-alpha04 后崩溃

Foo::class.java 和 Foo::javaClass 有什么区别?

如何在顶级函数中使用 koin 注入依赖项

Android Room - error: Cannot figure out how to save this field into database

Dagger2 Qualifier 不适用于 Kotlin?

Mockito 的 argThat 在 Kotlin 中返回 null

Kotlin:sealed class cannot "contain" data classes?

Kotlin:使用Gradle进行增量编译

当被Spring代理类访问时,Kotlin实例变量为null

如何在Kotlin中创建无限长的序列

接口中的属性不能有支持字段