Подтвердить что ты не робот

Проверьте, является ли объект экземпляром класса (но не является экземпляром его подкласса)

В этом примере:

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)

4b9b3361

Ответ 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 и нулевая проверка должны быть все, что вам нужно.