Mam prosty wzór fabryczny, w którym implementacja jest określana poprzez rozdzielczość przeciążenia. Problem polega na tym, że kompilator Kotlin narzeka z "niejednoznacznością rozdzielczości przeładowania" dla wbudowanej lambda.Kotlin: Inline lambda i przeciążenie rozdzielczości niejednoznaczności
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
W jaki sposób kompilator Kotlin rozwiązuje problem przeciążenia i dlaczego liniowa wartość lambda jest niejednoznaczna?
To wydaje się być błędem, ponieważ jeśli rzucę lambdę w stylu '{i: Int -> 1.0} jako (Int) -> Double', nie ma dwuznaczności, ale mówi się, że rzutowanie nie jest potrzebne. Ponadto, jeśli wypakowuję lambda do 'val l = {i: Int -> 1.0}' i używam go, znowu nie ma dwuznaczności. Wyszukaj w tym problemie moduł do śledzenia błędów, a jeśli go nie ma, zrób nowy: https://youtrack.jetbrains.com/issues/KT – hotkey
Kolejną interesującą rzeczą jest to, że jeśli rzucisz lambdę jako @hotkey, IDE powie ty, że to nie jest konieczne. Ale w momencie, gdy go usuniesz, narzeka na niejednoznaczność. –
Dzięki za wejście! Pomyślałem, że to prawdopodobnie błąd. Złożył raport na https://youtrack.jetbrains.com/issue/KT-11265 –