Ответ 1
Class.isInstance делает то, что вы хотите.
if (Point.class.isInstance(someObj)){
...
}
Конечно, вы не должны использовать его, если можете использовать instanceof
вместо этого, но для сценариев отражения это часто пригодится.
Я хочу проверить, является ли объект o
экземпляром класса C
или подкласса C
.
Например, если p
имеет класс Point
, я хочу, чтобы x.instanceOf(Point.class)
был true
, а также x.instanceOf(Object.class)
равным true
.
Я хочу, чтобы он работал также для примитивных типов в штучной упаковке. Например, если x
является Integer
, тогда x.instanceOf(Integer.class)
должен быть true
.
Есть ли такая вещь? Если нет, как я могу реализовать такой метод?
Class.isInstance делает то, что вы хотите.
if (Point.class.isInstance(someObj)){
...
}
Конечно, вы не должны использовать его, если можете использовать instanceof
вместо этого, но для сценариев отражения это часто пригодится.
Я хочу проверить, является ли объект o экземпляр класса c или подкласс c. Например, если p класса Точка, которую я хочу x.instanceOf(Point.class)
Ум... Что? Что такое o, p и x?
Я хочу, чтобы он работал и для примитивных типы. Например, если x является целое число x.instanceOf(Integer.class), а также x.instanceOf(Object.class) должен быть правда.
Нет. Он даже не компилируется. Примитивы не являются объектами, и вы не можете вызывать методы на них.
Во всяком случае, есть три вещи, одна из которых может определенно достигать того, чего вы хотите (они несколько отличаются друг от друга тем, где именно применяются:
instanceof
, если вы знаете класс во время компиляции.x instanceof Integer
x instanceof Object
вам просто нужно использовать правильный синтаксис
для типов примитивов, вы должны сделать это совершенно иначе. Поскольку вы не можете создавать методы для них, вам нужен класс, поддерживающий метод. Поэтому вместо "x.instanceOf(Integer.Class)" вы должны вызвать "MyClassComparer.instanceOf(x, Integer.Class)" или что-то в этом роде. Это может быть легко реализовано с помощью методов перегрузки, но я не вижу случая, когда эта функциональность будет желательна вообще.
Фактически в Java существует логический оператор, называемый instanceof, который может быть использован для определения того, является ли объект экземпляром класса, экземпляром подкласса или экземпляром класса, реализующего определенный интерфейс.
if(obj instanceof SomeClass) {
// Do something
}
В учебнике Java есть хороший пример этого оператора
Вы можете сделать:
if (foo instanceof classNameYouWantToCheck)
"Я хочу, чтобы он работал и для примитивных типов. Например, если x является целым числом, тогда x.instanceOf(Integer.class), а также x.instanceOf(Object.class) должно быть истинным."
Почему? Примитивные типы и ссылочные типы полностью разделены. Примитивный int не является подтипом Integer или Object. Тип примитивного значения всегда известен статически во время компиляции, поэтому нет смысла тестировать его тип. Конечно, вы можете ввести примитивное значение, а затем проверить его тип:
(Integer)5 instanceof Integer
Но какова была бы точка?
Я думаю, вы запутались в экземпляре для raw-объектов и общих
obj instanceof Class
obj instanceof Class<?> // this is the one you want