Нужен ли нам класс (или KClass) после Reified? - PullRequest
0 голосов
/ 27 января 2019

С reified я мог бы заменить приведенную ниже функцию

private fun <T>createFragmentX(fragmentClass: Class<T>, fragmentArgs: Bundle?): Fragment {
    try {
        val fragment = fragmentClass.newInstance() as Fragment
        fragment.arguments = fragmentArgs
        return fragment
    } catch (exception: Exception) {
        throw RuntimeException(exception.message)
    }
}

на эту

private inline fun <reified T>createFragmentZ(fragmentArgs: Bundle?): Fragment {
    try {
        val fragment = T::class.java.newInstance() as Fragment
        fragment.arguments = fragmentArgs
        return fragment
    } catch (exception: Exception) {
        throw RuntimeException(exception.message)
    }
}

Мне кажется, с reified больше нет необходимости использовать Class или KClass.Я прав?

Есть ли другое использование Class или KClass, которое не может быть выполнено reified, кроме того, что он хотел сделать работу чистого отражения?

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Вам не нужно передавать его как параметр здесь, но ваш код все еще использует Class: это то, что T::class.java. Так что да, во многих случаях вам нужно Class, и ваш - один из них.

0 голосов
/ 27 января 2019

Краткий ответ:

В вашем примере это не имеет значения, за исключением эстетики.

Длинный ответ:

Если вы передадите T какreified, вы можете извлечь KClass из параметра типа reified T, например,

val kClass = T::class

в любое время.Затем у вас есть все опции, которые вы бы использовали, используя KClass в качестве параметра, поэтому здесь нет никакой разницы.


В некоторых случаях вам нужно использовать KClass в качестве параметра.Здесь два:

1) Нет встроенного

Когда вы не хотите, чтобы ваша функция была inline, потому что использование типа reified работает только свстроенные функции.

2) Значения по умолчанию

Другая ситуация может быть значениями по умолчанию:

fun f(kClass: KClass<*> = Int::class) { /*...*/ }

Вы не можете достичь точно такого же спараметр типа reified.

Вывод:

Во всех других случаях используйте параметр универсального типа, поскольку он делает сайт вызова более сжатым, как показано здесь (которыйможет быть личным предпочтением):

inline fun <reified T> printType() {
    println(T::class.simpleName)
}

fun printType(kClass: KClass<*>) {
    println(kClass.simpleName)
}

Call-сайт

printType<Int>() // better
printType(Int::class)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...