Резервный SAM-конструктор нельзя удалить для объявленной функции Kotlin, но работает над объявленной Java-функцией

У меня есть функция класса Java, как показано ниже

public void setPositiveButton(int resId, DialogInterface.OnClickListener listener) 

У меня также есть те же функции класса Kotlin, что и ниже

 fun setPositiveButton(resId: Int, listener: DialogInterface.OnClickListener) 

Когда я называю их кодом Котлина

  javaClassObj.setPositiveButton(R.string.some_string, DialogInterface.OnClickListener { _, _ -> someFunc()}) kotlinClassObj.setPositiveButton(R.string.some_string, DialogInterface.OnClickListener { _, _ -> someFunc()}) 

Вызов функции Java Class может быть уменьшен, но не функция класса Kotlin

  javaClassObj.setPositiveButton(R.string.some_string, { _, _ -> someFunc()}) kotlinClassObj.setPositiveButton(R.string.some_string, DialogInterface.OnClickListener { _, _ -> someFunc()}) 

Почему вызов функции Kotlin не позволяет сократить избыточный SAM-конструктор в соответствии с включенным для Java?

Почему вы используете SAM в котлин? в то время как у него есть встроенная поддержка функций.

Соглашение SAM используется в java8 как работа, не имеющая поддержки родной функции.

из kotlin doc # sam-conversion :

Обратите внимание, что преобразования SAM работают только для интерфейсов, а не для абстрактных классов, даже если они также имеют только один абстрактный метод.

Также обратите внимание, что эта функция работает только для Java interop; поскольку Kotlin имеет собственные типы функций, автоматическое преобразование функций в реализации интерфейсов Kotlin не является необходимым и поэтому не поддерживается.

вы должны затем объявить функцию напрямую.

 fun setPositiveButton(resId: Int, listener: (DialogInterface, Int) -> Unit) { listener.invoke( //DialogInterface, Int ) } 

и затем его можно использовать

 setPositiveButton(1, { _, _ -> doStuff() }) 
Intereting Posts