为什么Lambda表达式对于Kotlin和Java类表现不同?
为什么我可以使用Lambda作为类java.lang.Thread
,但不能用于MyThread
?
interface MyRunnable{ fun run() } class MyThread(runnable : MyRunnable){ } fun test(){ Thread({}) // All Alright MyThread({}) //Exception. Type mismatch <<-- Why ? }
链接检查这个例子: https : //try.kotlinlang.org/#/UserProjects/tbs79qfkh50psp7r3qrdrinrmt/sfkpjq1bjvg4r6d5rmnu6mp4a8
从SAM转换的文档:
请注意,此功能仅适用于Java interop; 由于Kotlin具有适当的函数类型,函数自动转换为Kotlin接口的实现是不必要的,因此不受支持。
换句话说,只有对Java的调用才支持{ ... }
语法。 公共理由是你可以做任何一个:
-
让您的
MyThread
构造函数将第一类函数类型作为参数。 -
使用对象表达式 :
MyThread(object : MyRunnable { override fun run() {} })
这显然相当冗长。 但是,根据这个 Kotlin票据,lambda语法实际上只是Java interop的一部分,而不是核心语言的一部分,所以需要一些谨慎的设计来做更多的事情。
- 使用Kotlin中的Java Stream API获取列表中的元素
- 将加载animation添加到kotlin中的自定义对话框
- Kotlin对象/单例的方法是否同步?
- 从1.0.2 – 1.0.3升级Kotlin:java.lang.NoSuchMethodError:没有虚方法provideInjectedData $ app_compileDebugKotlin()
- kotlin协程和timer是否有异步调用?
- 如何为kotlin中的函数参数设置不为null
- RxJava和Kotlin的花括号和正常括号有什么区别?
- 在Kotlin中,当枚举类实现接口时,如何解决继承的声明冲突?
- 注入不能与第二个构造函数一起使用