对于Kotlin声明的函数,冗余的SAM构造函数不能被移除,而是在Java声明的函数上工作
我有一个Java类的功能如下
public void setPositiveButton(int resId, DialogInterface.OnClickListener listener)
我也有相同的Kotlin Class功能,如下所示
fun setPositiveButton(resId: Int, listener: DialogInterface.OnClickListener)
当我从Kotlin代码打电话给他们时
javaClassObj.setPositiveButton(R.string.some_string, DialogInterface.OnClickListener { _, _ -> someFunc()}) kotlinClassObj.setPositiveButton(R.string.some_string, DialogInterface.OnClickListener { _, _ -> someFunc()})
可以减少Java类函数调用,但不能减少Kotlin类函数
javaClassObj.setPositiveButton(R.string.some_string, { _, _ -> someFunc()}) kotlinClassObj.setPositiveButton(R.string.some_string, DialogInterface.OnClickListener { _, _ -> someFunc()})
为什么Kotlin函数调用不能按照为Java启用的方式减少冗余SAM-Constructor?
- Android N Java 8功能(Jack编译器)和Kotlin互操作
- Kotlin:通过Kotlin中的Data类在Java类中设置一个私有布尔值。 为什么我无法做到这一点?
- 当使用Java / Kotlin进行编程时,建议使用尾递归还是迭代版本? 性能有什么不同?
- 与Gradle不兼容的ClassChangeError
- Kotlin&Hibernate IllegalArgumentException:无法将字符串字段Job.name设置为Job
你为什么要在kotlin中使用SAM? 同时它具有对功能的本地支持。
在java8中使用SAM约定作为没有本地功能支持的工作。
来自kotlin doc#sam-conversions :
请注意,SAM转换仅适用于接口,不适用于抽象类,即使这些也只有一个抽象方法。
此外,请注意,此功能仅适用于Java interop; 由于Kotlin具有适当的函数类型,函数自动转换为Kotlin接口的实现是不必要的,因此不受支持。
你应该直接声明一个函数。
fun setPositiveButton(resId: Int, listener: (DialogInterface, Int) -> Unit) { listener.invoke( //DialogInterface, Int ) }
然后才能使用
setPositiveButton(1, { _, _ -> doStuff() })
- 在java类中调用扩展函数作为任何RX操作符
- Kotlin和Gradle没有Maven中央?
- 如何修复与Spring安全代理的val字段初始化?
- 默认值@ProjectedPayload / ProjectingJackson2HttpMessageConverter
- 如何让黄瓜让Spring注入一步定义类?
- 如何避免Java / Kotlin / IntelliJ IDEA中的StackOverFlow错误?
- 如何在Kotlin中使用Double Epsilon / Precision调用assertEquals?
- Mockito可以在方法调用时根据它们的值validation参数吗?
- 如何在Java中将字符串转换为long?