Я знаю, что во время выполнения параметры типа будут стерты, и, следовательно, мы не сможем получить к ним прямой доступ. Вот почему в 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. Кто-нибудь, пожалуйста, помогите мне.
clazz
— это не имя класса, поэтому с ним нельзя использовать is
. Это свойство типа Class<T>
. Поэтому вы должны использовать ==
, чтобы сравнить с ним.
if (obj::class.java == clazz) { // ...
Обратите внимание, что obj::class.java == clazz
ложно, если obj
на самом деле является экземпляром подкласса, а is
будет истинным. Чтобы включить подклассы, воспользуйтесь ответом gidds. (Я уверен, что вы это знаете, но люди, которые читают ответ, могут не знать!).
Вы можете сравнивать объекты Class с учетом подклассов, используя Class.isAssignableFrom() . (Но я думаю, что Class.isInstance() в этом случае проще и понятнее.)
Вы можете использовать динамический эквивалент is
, то есть Class.isInstance():
if (clazz.isInstance(obj)) { // ...
(KClass также имеет метод isInstance(), если вы хотите придерживаться чистого Kotlin.)
«даже пробовал obj is clazz::class.java» Это будет объект класса
java.lang.Class
, так что хорошо, что не получилось :)