Java instanceof с именем класса
Мне просто интересно спросить об этом, может быть, это совершенно бессмысленно.
Когда мы используем instanceof в java, например:
if (a instanceof Parent){ //"Parent" here is a parent class of "a"
}
почему мы не можем использовать, как показано ниже:
if (a instanceof Parent.class){
}
Получается ли второй "экземпляр" более понятным с точки зрения строгого программирования? В чем разница между "Родительским" и "Родительским классом"?
Ответы
Ответ 1
В чем разница между "Родительским" и "Родительским классом"?
Последний является литералом класса - способом доступа к объекту типа Class<Parent>
.
Первый - это просто имя класса, которое используется в различных ситуациях - при вызове статических методов, конструкторов, кастингов и т.д.
Получается ли второй "экземпляр" более понятным с точки зрения строгого программирования?
Ну, не так как язык определен - instanceof
работает только с именем типа, а не с выражением. Если вы могли бы написать
if (a instanceof Parent.class)
то я ожидаю, что вы сможете написать:
Class<?> clazz = Parent.class;
if (a instanceof clazz)
... и это не так, как это работает. С другой стороны, существует метод Class.isInstance
, который вы можете вызвать, если хотите.
Что вы подразумеваете под "представлением о строгом программировании"?
Ответ 2
Parent
- это класс, поэтому второй пример не имеет больше смысла, чем первый. Вы спрашиваете, является ли экземпляр экземпляром класса, a instanceof Parent
является довольно прямым выражением этого.
Parent.class
является экземпляром Class
, поэтому, даже если второй пример скомпилирован (это не так, правая часть instanceof
сама не может быть экземпляром), он не будет проверять, что вы хотите его проверить.: -)
Ответ 3
Parent
- это имя типа. Parent.class
- это, по существу, статическая переменная, которая ссылается на объект (в частности, экземпляр Class
). Вы хотите спросить, является ли a
экземпляром типа Parent
, а не экземпляром объекта, который сам является экземпляром какого-либо другого типа (с именем Class
).
Ответ 4
Когда вы пишете Parent.class
, значит, вы создаете объект java.lang.Class
для своего родительского класса.
Так что if (a instanceof Parent.class){
}
это не сработает для вас.
Подробнее о классе класса см. следующие ссылки:
Class
Экземпляры класса Class представляют классы и интерфейсы в исполняемом Java-приложении. Каждый массив также относится к классу, который отражается как объект класса, который совместно используется всеми массивами с тем же типом элемента и количеством измерений. Примитивные типы Java (boolean, byte, char, short, int, long, float и double), а также ключевое слово void также представлены как объекты класса.
Ответ 5
Статический член Parent.class
фактически является объектом. Вы можете назначить его переменной типа Object
или введите Class
, если хотите:
Object o = Parent.class;
Class c = Parent.class;
Parent
, с другой стороны, не является объектом или переменной: это Type Name, согласно спецификации Java.
Если бы вы могли сделать это...
a instanceof Parent.class
Так как Parent.class
- это объект, то вы могли бы также сделать это:
Cat myCat = new DomesticLonghair();
a instanceof myCat;
... это просто глупо.