首页 文章

Kotlin:内联lambda和重载决策模糊

提问于
浏览
10

我有一个简单的工厂模式,其中的实现是通过重载决定来确定的 . 问题是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被认为是不明确的?

1 回答

  • 5

    Kotlin编译器只解析每个表达式一次 . 因此,当编译器开始解析lambda表达式时,它应该知道lambda参数的类型 . 因为这个编译器应该选择方法之一 create before 它开始查看lambda内部 .

    例:

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

    这里我们不能选择函数之一 foo ,因为没有一个函数更具体那个,所以我们可以't start resolution for lambda expression because we don'知道 it 的类型 .

    在您的示例中,理论上可以在选择特定函数之前启动lambda的解析,因为对于所有潜在函数,lambda参数的类型都是相同的 . 但这可能很难实现,这是非常重要的逻辑 .

相关问题