Как получить стертый тип параметра типа внутри класса

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

class Outer<T> {
    inner class Inner(private val clazz: Class<T>) {
        private fun func() {
            if (obj is clazz) {    // even tried obj is clazz::class.java
                ...
            } else {
                ...
            }
        }
    }
}

Но это дает мне ошибку Unresolved reference: clazz в студии Android. Кто-нибудь, пожалуйста, помогите мне.

«даже пробовал obj is clazz::class.java» Это будет объект класса java.lang.Class, так что хорошо, что не получилось :)

Alexey Romanov 10.12.2020 14:45
Сила классов Java: сравнение с языком C
Сила классов Java: сравнение с языком C
Абстракция" - это процесс упрощения сложных сущностей или концепций реального мира с целью их применения в форме программирования. В Java класс...
0
1
243
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

clazz — это не имя класса, поэтому с ним нельзя использовать is. Это свойство типа Class<T>. Поэтому вы должны использовать ==, чтобы сравнить с ним.

if (obj::class.java == clazz) { // ...

Обратите внимание, что obj::class.java == clazz ложно, если obj на самом деле является экземпляром подкласса, а is будет истинным. Чтобы включить подклассы, воспользуйтесь ответом gidds. (Я уверен, что вы это знаете, но люди, которые читают ответ, могут не знать!).

Alexey Romanov 10.12.2020 14:44

Вы можете сравнивать объекты Class с учетом подклассов, используя Class.isAssignableFrom() . (Но я думаю, что Class.isInstance() в этом случае проще и понятнее.)

gidds 10.12.2020 18:46

Вы можете использовать динамический эквивалент is, то есть Class.isInstance():

if (clazz.isInstance(obj)) { // ...

(KClass также имеет метод isInstance(), если вы хотите придерживаться чистого Kotlin.)

Другие вопросы по теме