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)
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.
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.
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.
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));
}
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);
}
}
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 -:
instanceof
l'opérateur ne lance pasNullPointerException
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).car.getClass().equals(Car.class)
lancerNullPointerException
exception dans le cas où sicar
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 exemplecar != null && car.getClass().equals(Car.class)
pour l'empêcher deNullPointerException
.instanceof
opérateur indique si un objet est une instance d'une classe ou des classes parentes (à tout niveau).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)
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.