Kotlin:内联 lambda 和重载解析歧义
Kotlin: Inline lambda and overload resolution ambiguity
我有一个简单的工厂模式,其中的实现是通过重载决议来确定的。问题是 Kotlin 编译器抱怨内联 lambda "Overload resolution ambiguity.."。
class Foo(){
companion object Factory {
fun create(x: Int, f: (Int) -> Double) = 2.0
fun create(x: Int, f: (Int) -> Int) = 1
}
}
fun main(args:Array<String>){
val a = Foo.create(1,::fromDouble) //OK
val b = Foo.create(1,::fromInt) //OK
val ambiguous = Foo.create(1){i -> 1.0} //Overload resolution ambiguity?
}
fun fromDouble(int:Int) = 1.0
fun fromInt(int:Int) = 1
Kotlin 编译器如何解决重载决议以及为什么内联 lambda 被认为是不明确的?
Kotlin 编译器只解析每个表达式一次。
因此,当编译器开始解析 lambda 表达式时,它应该知道 lambda 参数的类型。
因为这个编译器应该在 create
之前选择其中一种方法 它开始查看 lambda.
示例:
fun foo(f: (Int) -> Int) = 1
fun foo(f: (String) -> String) = ""
val bar = foo {
println(it)
5
}
这里我们不能选择其中一个函数 foo
因为没有一个比另一个更具体,所以我们无法开始解析 lambda 表达式,因为我们不知道 [= 的类型13=].
在您的示例中,理论上可以在选择特定函数之前开始解析 lambda,因为对于所有潜在函数,lambda 参数的类型都是相同的。但这是可能难以实现的不平凡的逻辑。
我有一个简单的工厂模式,其中的实现是通过重载决议来确定的。问题是 Kotlin 编译器抱怨内联 lambda "Overload resolution ambiguity.."。
class Foo(){
companion object Factory {
fun create(x: Int, f: (Int) -> Double) = 2.0
fun create(x: Int, f: (Int) -> Int) = 1
}
}
fun main(args:Array<String>){
val a = Foo.create(1,::fromDouble) //OK
val b = Foo.create(1,::fromInt) //OK
val ambiguous = Foo.create(1){i -> 1.0} //Overload resolution ambiguity?
}
fun fromDouble(int:Int) = 1.0
fun fromInt(int:Int) = 1
Kotlin 编译器如何解决重载决议以及为什么内联 lambda 被认为是不明确的?
Kotlin 编译器只解析每个表达式一次。
因此,当编译器开始解析 lambda 表达式时,它应该知道 lambda 参数的类型。
因为这个编译器应该在 create
之前选择其中一种方法 它开始查看 lambda.
示例:
fun foo(f: (Int) -> Int) = 1
fun foo(f: (String) -> String) = ""
val bar = foo {
println(it)
5
}
这里我们不能选择其中一个函数 foo
因为没有一个比另一个更具体,所以我们无法开始解析 lambda 表达式,因为我们不知道 [= 的类型13=].
在您的示例中,理论上可以在选择特定函数之前开始解析 lambda,因为对于所有潜在函数,lambda 参数的类型都是相同的。但这是可能难以实现的不平凡的逻辑。