Почему функции Kotlin reified лучше? - PullRequest
0 голосов
/ 28 февраля 2019

Официальные документы Kotlin и этот ответ делают большую работу, объясняя, как Kotlin reified позволяет нам изменять что-то вроде:

myJsonString.toData(MyDataClass::class)

На:

myJsonString.toData<MyDataClass>()

Но я тоже не думаю, что хорошо объяснил мотивы.Является ли функция reified предпочтительнее, потому что она сохраняет несколько символов?Или есть другие преимущества, связанные с отсутствием необходимости передавать класс в качестве параметра?

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Еще одним преимуществом параметров типа reified является то, что они предоставляют полную информацию о типе, включая аргументы типа, когда тип известен во время компиляции.

abstract class TypeReference<T> : Comparable<TypeReference<T>> {
    val type: Type = 
        (javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0]

    override fun compareTo(other: TypeReference<T>) = 0
}

inline fun <reified T: Any> printGenerics() {
    val type = object : TypeReference<T>() {}.type
    if (type is ParameterizedType)
        type.actualTypeArguments.forEach { println(it.typeName) }
}

printGenerics<HashMap<Int, List<String>>>()
java.lang.Integer
java.util.List<? extends java.lang.String>

См .: Как получить фактические аргументы типа усовершенствованного универсального параметра в Kotlin?

0 голосов
/ 28 февраля 2019

Мотивация тип стирания в конце концов.Обобщения в JVM - это круто, но они помогают только во время компиляции.С reified вы можете сделать универсальные типы доступными во время выполнения.Это приводит к более чистым API, как показано в этой публикации и ответу yole, более чистым DSL (они много используют reified), и, конечно, также к более простым реализациям, которые полагаются на информацию о типе, которая обычно стирается, как показано горячей клавишей.

0 голосов
/ 28 февраля 2019

Другое преимущество заключается в том, что параметр типа может быть выведен.Например:

fun foo(myData: MyDataClass) { ... }

foo(myJsonString.toData()) // no need to specify MyDataClass at all
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...