I have a Java Class function as below
public void setPositiveButton(int resId, DialogInterface.OnClickListener listener)
I also have the same Kotlin Class function as below
fun setPositiveButton(resId: Int, listener: DialogInterface.OnClickListener)
When I call them from a Kotlin code
javaClassObj.setPositiveButton(R.string.some_string,
DialogInterface.OnClickListener { _, _ -> someFunc()})
kotlinClassObj.setPositiveButton(R.string.some_string,
DialogInterface.OnClickListener { _, _ -> someFunc()})
The Java Class function call could be reduced, but not the Kotlin Class function
javaClassObj.setPositiveButton(R.string.some_string,
{ _, _ -> someFunc()})
kotlinClassObj.setPositiveButton(R.string.some_string,
DialogInterface.OnClickListener { _, _ -> someFunc()})
Why can't the Kotlin function call reduce the redundant SAM-Constructor as per enabled for Java?
Extending @humazed answer as compiler complains that
lambda argument should be moved out of parenthesis
setPositiveButton("ok"){_,_ -> doSomething()}
Why would you use SAM in kotlin? while it has native support for functions.
The SAM convention is used in java8 as a workaround not having native function support.
from kotlin doc#sam-conversions:
Note that SAM conversions only work for interfaces, not for abstract classes, even if those also have just a single abstract method.
Also, note that this feature works only for Java interop; since Kotlin has proper function types, automatic conversion of functions into implementations of Kotlin interfaces is unnecessary and therefore unsupported.
you should then declare a function directly.
fun setPositiveButton(resId: Int, listener: (DialogInterface, Int) -> Unit) {
listener.invoke(
//DialogInterface, Int
)
}
and then it can be used
setPositiveButton(1, { _, _ -> doStuff() })
In kotlin 1.4 you can use SAM conversions for Kotlin classes.
fun interface Listener {
fun listen()
}
fun addListener(listener: Listener) = a.listen()
fun main() {
addListener {
println("Hello!")
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With