Ho un modello di fabbrica semplice in cui l'implementazione viene determinata tramite la risoluzione di sovraccarico. Il problema è che il compilatore Kotlin si lamenta con "Ambiguità della risoluzione di sovraccarico .." per il lambda in linea.Kotlin: lambda in linea e ambiguità della risoluzione di sovraccarico
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
Come funziona la risoluzione di sovraccarico compilatore risolvere Kotlin e perché è il lambda linea considerata ambigua?
Questo sembra essere un bug, perché se lancio il lambda come '{i: Int -> 1.0} come (Int) -> Double' non c'è ambiguità, ma dice che il cast non è necessario. Inoltre, se estrapro il lambda in 'val l = {i: Int -> 1.0}' e lo uso, di nuovo non c'è ambiguità. Si prega di cercare il bug tracker per questo problema e se non è lì ne file uno nuovo: https://youtrack.jetbrains.com/issues/KT – hotkey
Un'altra cosa interessante è che se si lancia il lambda come fa @hotkey, l'IDE dirà tu che non è necessario. Ma nel momento in cui lo rimuovi, si lamenta dell'ambiguità. –
Grazie per l'input! Ho pensato che probabilmente era un bug. Presentato un rapporto all'indirizzo https://youtrack.jetbrains.com/issue/KT-11265 –