Я создал класс:
class SomeClass {
var listener: SomeListener? = null
interface SomeListener {
fun onClick(v: View?)
}
fun addSomeListener(l: SomeListener){
listener = l
}
}
И я называю это следующим образом, который отлично работает:
SomeClass().addSomeListener(object : SomeClass.SomeListener {
override fun onClick(v: View?) {
// Do something
}
})
Однако следующий синтаксис не работает в Android Studio::
SomeClass().addSomeListener{ view ->
// Do something
}
Несоответствие типов. Требуется: SomeClass.SomeListener Найдено: () → Единица измерения
Я этого не понимаю, потому что метод Android setOnClickListener
реализован так же:
/**
* Register a callback to be invoked when this view is clicked. If this view is not
* clickable, it becomes clickable.
*
* @param l The callback that will run
*
* @see #setClickable(boolean)
*/
public void setOnClickListener(@Nullable OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
getListenerInfo().mOnClickListener = l;
}
и...
/**
* Interface definition for a callback to be invoked when a view is clicked.
*/
public interface OnClickListener {
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
void onClick(View v);
}
это, очевидно, можно назвать как:
someView.setOnClickListener { view ->
// Do something
}
Что мне не хватает?
Звонит SAM Conversions
. Если вы хотите, чтобы это работало, вам нужно добавить ключевое слово fun
для вашего интерфейса, чтобы он выглядел так:
fun interface SomeListener {
fun onClick(v: View?)
}
Вы можете узнать больше об этом, прочитав этот принятый ответ.
Функциональные (SAM) интерфейсы: kotlinlang.org/docs/reference/fun-interfaces.html
Вы упускаете из виду, что интерфейсы Java здесь обрабатываются иначе, чем интерфейсы Kotlin.