Я вижу, что используется ключевое слово typealias, а затем вызывается метод invoke для этого "типа"

Может ли кто-нибудь дать представление о том, что это такое и как оно используется?

typealias NewKittiesReceived = (Kitty) -> Unit

class KittyRepository {
    private val timer = Timer()
    private val random = Random()
    private val period = TimeUnit.SECONDS.toMillis(1)

    internal fun receiveNewKitties(newKittiesReceived: NewKittiesReceived) {
        timer.schedule(object : TimerTask() {
            override fun run() {
                val nameRandom = random.nextInt(KittyNames.values().size)
                val ageRandom = random.nextInt(5)

                newKittiesReceived.invoke(Kitty(KittyNames.values()[nameRandom].name, ageRandom))
            }
        }, period, period)
    }
}
-4
dazza5000 2 Янв 2018 в 02:33

2 ответа

Лучший ответ

Часто удобнее иметь специальные имена для типов функций, такие как (Kitty) -> Unit. В конце концов, typealias просто дает нам способ определить псевдоним для такого (например) типа функции, который затем можно использовать во всем коде вместо этого явного типа в качестве замены 1: 1.

В вашем примере тип функции (Kitty) -> Unit имеет псевдоним NewKittiesReceived, который является аргументом показанной функции receiveNewKitties. Каждую переменную, содержащую функцию (newKittiesReceived в примере), можно вызвать с помощью function.invoke(arguments...) или проще с помощью function(arguments).

Есть только одна ситуация, в которой фактически используется typealias: определение newKittiesReceived: NewKittiesReceived будет переведено на newKittiesReceived: (Kitty) -> Unit.

Документы находятся здесь.

2
s1m0nw1 2 Янв 2018 в 02:34

Вот что говорится в документации:

Псевдонимы типа предоставляют альтернативные имена для существующих типов. Если имя типа слишком длинное, вы можете ввести другое более короткое имя и использовать вместо него новое.

Итак, как видите, типализации улучшают читаемость и сокращают имена до слишком длинных.

1
Willi Mentzel 2 Янв 2018 в 12:56