Есть ли что-то вроде instanceOf (Class <?> C) в Java? - PullRequest
81 голосов
/ 04 июня 2009

Я хочу проверить, является ли объект o экземпляром класса C или подкласса C.

Например, если p класса Point, я хочу, чтобы x.instanceOf(Point.class) было true, а также x.instanceOf(Object.class) было true.

Я хочу, чтобы он работал и для штучных примитивных типов. Например, если x является Integer, тогда x.instanceOf(Integer.class) должно быть true.

Есть ли такая вещь? Если нет, то как я могу реализовать такой метод?

Ответы [ 7 ]

157 голосов
/ 04 июня 2009

Class.isInstance делает то, что вы хотите.

if (Point.class.isInstance(someObj)){
    ...
}

Конечно, вы не должны использовать его, если вместо этого можете использовать instanceof, но для сценариев отражения это часто бывает полезно.

19 голосов
/ 04 июня 2009

Я хочу проверить, является ли объект o экземпляр класса с или подкласс c. Например, если р класса Point, я хочу x.instanceOf (Point.class)

Хм ... Что? Что такое o, p и x?

Я хочу, чтобы это работало и для примитива типы. Например, если х является целое число тогда x.instanceOf (Integer.class), а также x.instanceOf (Object.class) должен быть правда.

Нет. Это даже не должно компилироваться. Примитивы не являются объектами, и вы не можете вызывать методы для них.

В любом случае, есть три вещи, одна из которых может определенно достичь того, чего вы хотите (они несколько отличаются в зависимости от того, где именно они применяются:

  • Оператор instanceof, если вы знаете класс во время компиляции.
  • Class.isInstance () , если вы хотите сравнить класс объекта с классом, не известным во время компиляции.
  • Class.isAssignableFrom () , если вы хотите проверить назначаемость для двух объектов класса.
8 голосов
/ 04 июня 2009
x instanceof Integer
x instanceof Object

вам просто нужно использовать правильный синтаксис

для примитивных типов вы должны сделать это совершенно по-другому. Поскольку вы не можете создавать методы для них, вам нужен класс, который хранит метод. Поэтому вместо «x.instanceOf (Integer.Class)» вы должны вызвать «MyClassComparer.instanceOf (x, Integer.Class)» или что-то в этом роде. Это может быть легко реализовано путем перегрузки методов, но я не вижу случая, когда эта функциональность была бы желательной вообще.

4 голосов
/ 04 июня 2009

На самом деле в Java есть логический оператор instanceof, который можно использовать для определения, является ли объект экземпляром класса, экземпляром подкласса или экземпляром класса, который реализует определенный интерфейс.

if(obj instanceof SomeClass) {
    // Do something
}

В руководстве по Java есть хороший пример этого оператора

0 голосов
/ 04 декабря 2013

Я думаю, что вы не уверены в instanceof для необработанных и общих объектов

obj instanceof Class
obj instanceof Class<?> // this is the one you want
0 голосов
/ 04 июня 2009

"Я хочу, чтобы он работал и для примитивных типов. Например, если x является целым числом, тогда x.instanceOf (Integer.class), а также x.instanceOf (Object.class) должны быть истинными."

Почему? Примитивные типы и ссылочные типы полностью разделены. Примитив int не является подтипом Integer или Object. Тип примитивного значения всегда известен статически во время компиляции, поэтому нет смысла проверять его тип. Конечно, вы можете пометить примитивное значение и затем проверить его тип:

(Integer)5 instanceof Integer

Но какой в ​​этом смысл?

0 голосов
/ 04 июня 2009

Вы можете сделать:

if (foo instanceof classNameYouWantToCheck) 
...