Проверьте, является ли объект экземпляром класса (но не является экземпляром его подкласса)
В этом примере:
public class Foo{}
public class Bar extends Foo{}
....
void myMethod(Foo qux){
if (checkInstance(qux,Foo.class)){
....
}
}
Как проверить, является ли qux
экземпляром Foo (но не экземпляром его подкласса foo)? То есть:
- checkInstance (QUX, Foo.class) = TRUE
- checkInstance (QUX, Bar.class) = False
Есть ли какая-то инструкция типа instanceof
для этой проверки? или я должен использовать qux.getClass().equals(Foo.class)
Ответы
Ответ 1
Если вам нужно это сделать, единственный способ - это вариант getClass().equals(Foo.class)
, который вы предложили.
Однако цель OO-дизайна - позволить вам рассматривать любой Foo
тем же способом. Независимо от того, является ли экземпляр подклассом, он не имеет отношения к нормальной программе.
Ответ 2
Если вы ищете точное совпадение классов, единственным средством является qux.getClass().equals(Foo.class)
. instanceof также вернет true для подклассов.
Ответ 3
вы должны использовать instanceof
if(qux instanceof Foo && !(qux instanceof Bar)) {
...
}
Это работает как с классами, так и с интерфейсами, поэтому в большинстве случаев он должен предпочесть более .class
, который не работает с интерфейсами.
Ответ 4
Я просто пробовал следующий код, кажется, что он работает нормально
public class BaseClass {
private String a;
public boolean isInstanceOf(BaseClass base){
if(base == null){
return false;
}
else if(getClass() == base.getClass()){
return true;
}else{
return false;
}
}
}
public class DervidClass extends BaseClass {
public boolean isInstanceOf(DervidClass base) {
if(base == null){
return false;
}
else if(getClass() == base.getClass()){
return true;
}else{
return false;
}
}
}
public class myTest {
public static void main(String[] args) throws ParseException {
BaseClass base = new BaseClass();
BaseClass base1 = new BaseClass();
DervidClass derived = new DervidClass();
BaseClass d1 = new DervidClass();
System.out.println(base.isInstanceOf(d1));
System.out.println(d1.isInstanceOf(d1));
System.out.println((d1 instanceof BaseClass));
}
Ответ 5
package com.instance;
public class Foo {
public void instance(Foo f) {
System.out.println("---------");
System.out.println(f.getClass());
System.out.println(getClass());
if (f.getClass() == getClass()) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}
package com.instance;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
Foo f1 = new Foo();
Foo f2 = new Foo();
Foo f3 = new Bar();
f1.instance(f1);
f1.instance(f2);
f1.instance(f3);
}
}
Ответ 6
Я прочитал все ответы, которые были опубликованы до сих пор, но пока не нашел удовлетворительного ответа. Ответ на Есть ли какой-то оператор вроде instanceof
для этой проверки? или я должен использовать вопрос qux.getClass().equals(Foo.class)
, я бы сказал, да, в java есть оператор instanceof
, чтобы проверить, является ли объект экземпляром класса. Ниже приведен пример:
class Vehicle {
}
class Car extends Vehicle {
}
public class Research {
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
if (vehicle instanceof Vehicle) {
System.out.println("vehicle instanceof Vehicle : TRUE");
} else {
System.out.println("vehicle instanceof Vehicle : FALSE");
}
if (vehicle instanceof Car) {
System.out.println("vehicle instanceof Car : TRUE");
} else {
System.out.println("vehicle instanceof Car : FALSE");
}
System.out.println();
Car car = new Car();
if (car instanceof Vehicle) {
System.out.println("car instanceof Vehicle : TRUE");
} else {
System.out.println("car instanceof Vehicle : FALSE");
}
if (car instanceof Car) {
System.out.println("car instanceof Car : TRUE");
} else {
System.out.println("car instanceof Car : FALSE");
}
}
}
Выход -:
vehicle instanceof Vehicle : TRUE
vehicle instanceof Car : FALSE
car instanceof Vehicle : TRUE
car instanceof Car : TRUE
Оператор Описание -: instanceof
указывает, является ли объект экземпляром класса или родительских классов (до любого уровня).
Строка вывода vehicle instanceof Car : FALSE
указывает, что оператор instanceof
не укажет, является ли объект экземпляром его подкласса.
Другой способ - использовать getClass().equals(Foo.class)
, чтобы определить, является ли объект экземпляром класса или нет. Давайте посмотрим ниже: -
class Vehicle {
}
class Car extends Vehicle {
}
public class Research {
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
if (vehicle.getClass().equals(Vehicle.class)) {
System.out.println("vehicle instanceof Vehicle : TRUE");
} else {
System.out.println("vehicle instanceof Vehicle : FALSE");
}
if (vehicle.getClass().equals(Car.class)) {
System.out.println("vehicle instanceof Car : TRUE");
} else {
System.out.println("vehicle instanceof Car : FALSE");
}
System.out.println();
Car car = new Car();
if (car.getClass().equals(Vehicle.class)) {
System.out.println("car instanceof Vehicle : TRUE");
} else {
System.out.println("car instanceof Vehicle : FALSE");
}
if (car.getClass().equals(Car.class)) {
System.out.println("car instanceof Car : TRUE");
} else {
System.out.println("car instanceof Car : FALSE");
}
}
}
Выход -:
vehicle instanceof Vehicle : TRUE
vehicle instanceof Car : FALSE
car instanceof Vehicle : FALSE
car instanceof Car : TRUE
Описание -: Из вышеприведенного примера было бы ясно, какой из двух (из двух выше) должен быть выбран, где?
Важные примечания -:
-
Оператор
-
instanceof
не генерирует исключение NullPointerException
в случае, если ссылочная переменная не указывает на какой-либо объект (т.е. имеет нулевую ссылку).
-
car.getClass().equals(Car.class)
будет генерировать исключение NullPointerException
в случае, если car
не указывает на какой-либо объект (т.е. имеет нулевую ссылку). Поэтому для этого нужно добавить дополнительную проверку нулевого значения, например car != null && car.getClass().equals(Car.class)
, чтобы предотвратить ее от NullPointerException
.
Оператор -
instanceof
сообщает, является ли объект экземпляром класса или родительских классов (до любого уровня).
-
car.getClass().equals(Car.class)
будет указывать, является ли объект экземпляром класса. (родительский и вспомогательный классы вообще не рассматриваются)
Ответ 7
Ну, вы уже знаете, что qux является экземпляром Foo (если он не равен null...), поэтому простая qux instanceof Bar
и нулевая проверка должны быть все, что вам нужно.