具有通用输入的高阶函数的重载分辨率歧义

问题描述 投票:0回答:1

我在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

删除最后一行后,此代码将编译而没有任何错误。如果这两个函数确实不能消除歧义,我希望函数声明本身会发生冲突(例如“冲突重载”)。如果它们是有效的声明,我如何明确地调用这些函数?

kotlin
1个回答
2
投票

实际上,您有两种异常的运算符重载。问题是编译器无法知道应该使用哪一个。如果您想调用相同类型的第二个运算符怎么办?无法扣除类型。

您可以做什么?可以以“常规”方式调用所有infix函数。然后您可以指定要使用的方法,因为编译器无法在该调用中确定:

© www.soinside.com 2019 - 2024. All rights reserved.