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被认为是不明确的?

One Solution collect form web for “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参数的类型是相同的。 但是这是一个不可思议的逻辑,可能很难实现。

  • 使用Kotlin的房间,建立数据库时得到异常
  • 为什么kotlin使用===如果基本类型的值相同,则比较原始类型
  • 如何在Android中将许多AsyncTasks转换为Rx Observables?
  • 如何为Spark Java提供动态数据库配置凭据?
  • 如何在Kotlin上同时捕获许多例外
  • Delegate.notNull和lateinit Kotlin之间的区别
  • Kotlin Android Project无法同步Gradle项目
  • 我怎样才能在kotlin的单行中声明值?
  • Gradle构建中未解决的Kotlin扩展函数的引用
  • JOOQ总和字段值:BigDecimal到Int
  • 为什么不能在Kotlin类型参数有其他界限,如果它是由另一个类型的参数?
  • Kotlin language will be the best programming language for Android.