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;

... это просто глупо.