На Java этот трюк хорошо обкатан, IDE Android Studio по одному клику вставляет шаблон для реализации кода выбранного интерфейса. На kotlin это работает немного сложнее.
К примеру, нам требуется реализовать Runnable интерфейс для создания экземпляра класса Thread.
Вы пишите в IDE «Thread», открываете скобку и вам открывается подсказка:
И ожидается, что возможным параметром будет реализация интерфейса Runnable.
Длинный синтаксис реализации предусматривает, что вы используете токен object:
1 2 3 4 5 6 7 |
val r = object: Runnable { override fun run() { TODO("Not yet implemented") } } Thread(r) |
Это можно записать короче, так как наш интерфейс является функциональным и требует реализации единственного метода:
1 2 3 4 5 |
val r = Runnable { TODO("Not yet implemented") } Thread(r) |
Переменная r нам тоже не нужна, если вы не используете её в других местах, потому можно ещё сильнее сократить запись:
1 2 3 4 |
Thread { TODO("Not yet implemented") } .start() |
Т.е. IDE знает, что мы можем здесь передать в качестве параметра экземпляр реализации интерфейса Runnable, потому нам не нужно указывать явно ни название интерфейса ни имя единственного метода, который мы реализуем. В конце мы тут же запускаем созданный поток.
Если бы требовалось передать параметры в этот метод, то запись бы выглядела так:
1 2 3 |
AnonymousInterfaceImplementaionSample { param1, param2 -> TODO("Not yet implemented") } |
Подсказку от IDE с шаблонами реализации методов интерфейса получить также можно. Наберите:
1 |
Thread(object: Runnable {}) |
object подкраситься красным, и если вы вызовите подсказку «ALT+insert», то там можно будет выбрать «имплементировать методы»:
Для функциональных интерфейсов это не очень полезно, я для прочих случаев удобно.