私は実装が過負荷解決によって決定される単純な工場パターンを持っています。問題は、Kotlinコンパイラがインラインラムダの「オーバーロード解決のあいまいさ」と不平を言うことです。Kotlin:インラインラムダとオーバーロード解決のあいまいさ
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コンパイラは過負荷解決をどのように解決し、インラインラムダは曖昧であると考えられますか?
ラムダを '{i:Int - > 1.0}(Int) - > Double'のようにキャストしてもあいまいさはありませんが、キャストは必要ないと言われているので、これはバグです。また、ラムダを 'val l = {i:Int - > 1.0}'に抽出して使用すると、やはりあいまいさはありません。この問題のバグトラッカーを探してください。新しいバグトラッカーを見つけてください:https://youtrack.jetbrains.com/issues/KT – hotkey
もう一つ興味深いのは、@hotkeyのようにラムダをキャストすると、IDEがあなたはそれが必要ではないことをあなたに伝えます。しかし、あなたがそれを削除した瞬間、それはあいまいさについて不平を言う。 –
ありがとう!おそらくバグだったと考えています。 https://youtrack.jetbrains.com/issue/KT-11265 –