Vérifier si un objet est une instance d'une classe (mais pas une instance de sa sous-classe)

Pour cet exemple:

public class Foo{}

public class Bar extends Foo{}

....

void myMethod(Foo qux){
   if (checkInstance(qux,Foo.class)){
     ....
   }
}

Comment puis-je vérifier si qux est une instance de Foo (mais pas une instance de sa sous-classe de toto)? Qui est:

  • checklinstance (qux, Foo.classe)=vrai
  • checklinstance (qux, Bar.classe)=false

Est-il une sorte de déclaration instanceof pour cette case? ou, devrais-je utiliser qux.getClass().equals(Foo.class)

28
demandé sur Raedwald 2013-05-22 13:48:19

7 réponses

si vous devez faire cela, le seul moyen serait le getClass().equals(Foo.class) option que vous avez suggérée.

cependant, le but de OO design est de vous permettre de traiter Foo de la même manière. Le fait que l'instance soit ou non une sous-classe ne devrait pas entrer en ligne de compte dans un programme normal.

43
répondu Duncan Jones 2013-05-22 09:53:17

si vous cherchez une correspondance exacte de classe, le seul moyen est qux.getClass().equals(Foo.class). instanceof retournera également true pour les sous-classes.

6
répondu nitegazer2003 2013-05-22 09:53:07
if(qux instanceof Foo && !(qux instanceof Bar)) {
    ...
}

cela fonctionne à la fois avec les classes et les interfaces, donc dans la plupart des cas, il devrait être préféré à .class qui ne fonctionne pas avec les interfaces.

3
répondu Marco Forberg 2013-05-22 09:52:19

je viens d'essayer de suivre le code, il semble que cela fonctionne bien

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));


    }
2
répondu Karthik Prasad 2013-05-22 10:17:17
    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);
    }

}
1
répondu boiledwater 2013-05-22 10:00:19

j'ai lu toutes les réponses qui ont été publiées jusqu'à présent, mais ne pouvait pas trouver de réponse satisfaisante encore. Répondre à Est-il une sorte de déclaration instanceof pour ce chèque? ou, devrais-je utiliser qux.getClass().equals(Foo.class) question, je dirais oui, il y a instanceof opérateur en java pour vérifier si l'objet est une instance de la classe. Ci-dessous est un exemple:

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");
        }
    }
}

Sortie:

vehicle instanceof Vehicle : TRUE
vehicle instanceof Car : FALSE

car instanceof Vehicle : TRUE
car instanceof Car : TRUE

Description -:instanceof l'opérateur dit si un objet est une instance d'une classe ou des classes parentes (à tout niveau).

vehicle instanceof Car : FALSE la ligne de sortie indique que instanceof l'opérateur ne dit pas si un objet est une instance de sa sous-classe.

une Autre façon est d'utiliser getClass().equals(Foo.class) pour déterminer si un objet est une instance d'une classe ou pas. Voyons ci-dessous l'exemple -:

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");
        }


    }
}

Sortie:

vehicle instanceof Vehicle : TRUE
vehicle instanceof Car : FALSE

car instanceof Vehicle : FALSE
car instanceof Car : TRUE

Description -: Il serait est-ce que l'exemple ci-dessus indique clairement lequel(parmi les deux précédents) devrait être choisi où?

Notes Importantes -:

  1. instanceof l'opérateur ne lance pas NullPointerException exception dans le cas où la variable de référence ne pointe pas vers un objet(c'est-à-dire qu'elle a une référence nulle).
  2. car.getClass().equals(Car.class) lancer NullPointerException exception dans le cas où si car ne pointe pas vers un objet(c'est-à-dire qu'il n'a pas de référence). Par conséquent, l'un doit placer un contrôle null supplémentaire avec ceci par exemple car != null && car.getClass().equals(Car.class) pour l'empêcher de NullPointerException.
  3. instanceof opérateur indique si un objet est une instance d'une classe ou des classes parentes (à tout niveau).
  4. car.getClass().equals(Car.class) indiquera si un objet est une instance de classe seulement. (Parent Et de Sous-classes ne seront pas pris en considération)
1
répondu Ashish Kumar 2017-02-15 09:14:37

Eh bien, vous savez déjà que qux est instanceof Foo (à moins que ce soit nul...), donc un simple qux instanceof Bar et un nul vérifier tout ce qu'il faut.

0
répondu vikingsteve 2013-05-22 09:54:15