«Невозможно использовать T в качестве параметра типа reified», когда функция make обнаруживает данные модели типа - PullRequest
1 голос
/ 05 марта 2020

Я создаю некоторый код для определения данных модели типа, используя класс «DefineTypeGeneri c».

Основной класс

fun main() {
    val list = ArrayList<Any>()
    list.add("Kelvin")
    list.add(23)
    DefineTypeGeneric<String>().checkType(list[0]) // work
    DefineTypeGeneric<String>().checkType(list[1]) // work
}

DefineTypeGeneri c Класс

class DefineTypeGeneric<T>(private val classGeneric: Class<T>) {
    companion object {
        inline operator fun <reified T>invoke() = DefineTypeGeneric(T::class.java)
    }
    fun checkType(t: Any) {
        when {
            classGeneric.isAssignableFrom(t.javaClass) -> println("Correct Type")
            else -> println("Wrong Type")
        }
    }
}

Это работа для этого случая.


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

functionGeneri c

fun <T>functionGeneric(t: Any) {
    DefineTypeGeneric<T>().checkType(t)
}

Я вызываю эту функцию.

functionGeneric<String>(list[0])

Но я получаю ошибку " Невозможно использовать 'T' в качестве параметра типа reified. Вместо этого используйте класс ".

Ошибка Невозможно использовать 'T' в качестве параметра типа reified. Вместо этого используйте класс

Как решить этот случай?

1 Ответ

1 голос
/ 05 марта 2020

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

inline fun <reified T> functionGeneric(t: Any) {
    DefineTypeGeneric<T>().checkType(t)
}

Причина этого в том, что ваш DefineTypeGeneric<T>() фактически встроен и имеет параметр типа T, используя информацию, которую он имеет на сайте вызова (необходимо использовать T::class.java).

Если вы не включите и новый functionGeneric, нет никакой информации о T на сайте вызовов DefineTypeGeneric<T>() (который находится внутри тела functionGeneric).


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

inline fun <reified T> checkType(t: Any) {
    when {
        T::class.java.isAssignableFrom(t::class.java) -> println("Correct")
        else -> println("Wrong")
    }
}

Или, если logi c более сложный, одну встроенную функцию и одну стандартную функцию:

inline fun <reified T> checkType(t: Any) = checkType(T::class.java, t)

fun <T> checkType(target: Class<T>, t: Any) {
    when {
        target.isAssignableFrom(t::class.java) -> println("Correct")
        else -> println("Wrong")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...