Kotlin:内联lambda和重载解析模糊

我有一个简单的工厂模式,其中的实现是通过重载决议确定的。 问题是,Kotlin编译器抱怨“重载解析歧义..”为内联lambda。

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参数的类型。 因为这个编译器应该开始查看lambda 之前选择其中一个方法create

例:

 fun foo(f: (Int) -> Int) = 1 fun foo(f: (String) -> String) = "" val bar = foo { println(it) 5 } 

在这里,我们不能选择函数foo一个,因为其中没有一个更具体,所以我们不能开始lambda表达式的解析,因为我们不知道it类型。

在你的例子中,理论上可以在选择特定函数之前开始解析lambda,因为对于所有可能的函数,lambda参数的类型是相同的。 但是这是一个不可思议的逻辑,可能很难实现。