我在Kotlin中具有以下两个高阶函数:
operator fun <T1> ((T1) -> Double).plus(f1: (T1) -> Double): (T1) -> Double = { t1: T1 -> TODO() }
operator fun <T1, T2> ((T1) -> Double).plus(f2: (T2) -> Double): (T1, T2) -> Double = { t1: T1, t2: T2 -> TODO() }
object A
object B
fun test(a: (A) -> Double, b: (B) -> Double): (A, B) -> Double = a + b
在最后一行,我收到以下错误:
Overload resolution ambiguity:
public operator fun <T1> ((TypeVariable(T1)) -> Double).plus(f1: (TypeVariable(T1)) -> Double): (TypeVariable(T1)) -> Double defined in root package
public operator fun <T1, T2> ((TypeVariable(T1)) -> Double).plus(f2: (TypeVariable(T2)) -> Double): (TypeVariable(T1), TypeVariable(T2)) -> Double defined in root package
删除最后一行后,此代码将编译而没有任何错误。如果这两个函数确实不能消除歧义,我希望函数声明本身会发生冲突(例如“冲突重载”)。如果它们是有效的声明,我如何明确地调用这些函数?
实际上,您有两种异常的运算符重载。问题是编译器无法知道应该使用哪一个。如果您想调用相同类型的第二个运算符怎么办?无法扣除类型。
您可以做什么?可以以“常规”方式调用所有infix函数。然后您可以指定要使用的方法,因为编译器无法在该调用中确定: