Почему класс в Intent имеет суффикс ":: class.java"? - PullRequest
0 голосов
/ 16 декабря 2018

Намерение в Котлине:

val intent = Intent(this, OtherActivity::class.java)

почему это не может быть просто:

val intent = Intent(this, OtherActivity)

?

Ответы [ 4 ]

0 голосов
/ 17 декабря 2018

, если вы в порядке с небольшим изменением пространства имен, и это реальная проблема в вашей команде, вы всегда можете объявить следующую функцию верхнего уровня:

inline fun <reified T> Intent(context: Context){
    return Intent(context, T::class.java)
}

, которую вы бы назвали, выполнив следующее:

val intent = Intent<MyActivity>(this)

Или, если хотите, вы можете объявить его как функцию расширения в Context:

inline fun <reified T> Context.Intent(){
    return Intent(this, T::class.java)
}

. Использовать его прямо так:

val intent = Intent<MyActivity>()
0 голосов
/ 16 декабря 2018

Второй аргумент этого конструктора Intent требует класс действия, которое вы хотите создать.Хотя было бы удобно получить класс, просто используя имя класса OtherActivity, синтаксис Java (и Kotlin) не поддерживает это.

Вместо этого Java предоставляет синтаксис .class (OtherActivity.class), а Kotlin предоставляет ::class для класса Kotlin и ::class.java (OtherActivity::class.java) для класса Java, что является намерениемнужен конструктор.

0 голосов
/ 16 декабря 2018

Используя ::class, Котлин поставляет KClass, который можно использовать для различных целей.Однако все еще существуют пакеты Java, которые используют Class, и среди них есть Intent.KClass не является классом, что означает, что Kotlin должен иметь способ доступа к обычному классу Java.

Класс Intent изначально написан на Java, что означает, что он использует Class.OtherActivity::class возвращает KClass, и KClass не может быть передан как Class.

SomeClass::class.java существует для целей взаимодействия.Вы также можете использовать Class вместо KClass в своем коде Kotlin;вы не будете получать предупреждения об этом, как если бы вы получали экземпляр Object over Any.Но вам все еще периодически требуется Class с взаимодействием Java.


Почему конкретно они пошли с ::class.java - это не то, что кто-то может ответить, кроме разработчиков самого языка.

0 голосов
/ 16 декабря 2018

Поскольку Intent является классом Java и ожидает в качестве аргументов контекст Android и класс Java (действие).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...