java - que - Compruebe si un objeto es una instancia de una clase(pero no una instancia de su subclase)
que es un objeto en java (7)
Acabo de intentar seguir el código, parece que funciona 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));
}
Para este ejemplo:
public class Foo{}
public class Bar extends Foo{}
....
void myMethod(Foo qux){
if (checkInstance(qux,Foo.class)){
....
}
}
¿Cómo puedo verificar si qux
es una instancia de Foo (pero no una instancia de su subclase de foo)? Es decir:
- checkInstance (qux, Foo.class) = true
- checkInstance (qux, Bar.class) = falso
¿Hay algún tipo de declaración como instanceof
para esta comprobación? o debería usar qux.getClass().equals(Foo.class)
Bueno, ya sabes que qux es una instancia de Foo (a menos que sea nula ...), por lo que una simple qux instanceof Bar
y una comprobación de nulos debería ser todo lo que necesitas.
He leído todas las respuestas que se han publicado hasta ahora, pero aún no he podido encontrar una respuesta satisfactoria. Respondiendo a ¿Hay algún tipo de declaración como instanceof
para esta comprobación? o debería usar qux.getClass().equals(Foo.class)
pregunta qux.getClass().equals(Foo.class)
Yo diría que sí, hay una instanceof
operador en java para verificar si el objeto es una instancia de clase. A continuación se muestra un ejemplo:
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");
}
}
}
Salida-:
vehicle instanceof Vehicle : TRUE
vehicle instanceof Car : FALSE
car instanceof Vehicle : TRUE
car instanceof Car : TRUE
Descripción-: instanceof
operator le dice si un objeto es una instancia de una clase o sus clases primarias (hasta cualquier nivel).
vehicle instanceof Car : FALSE
línea vehicle instanceof Car : FALSE
de salida indica que el operador instanceof
no dirá si un objeto es una instancia de su subclase.
Otra forma es usar getClass().equals(Foo.class)
para determinar si un objeto es una instancia de una clase o no. Veamos el siguiente ejemplo:
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");
}
}
}
Salida-:
vehicle instanceof Vehicle : TRUE
vehicle instanceof Car : FALSE
car instanceof Vehicle : FALSE
car instanceof Car : TRUE
Descripción-: Quedaría claro a partir del ejemplo anterior, cuál de los dos anteriores debería elegirse, ¿dónde?
Notas importantes-:
-
instanceof
operator no lanzará la excepciónNullPointerException
en caso de que la variable de referencia no apunte a ningún objeto (es decir, tenga referencia nula). -
car.getClass().equals(Car.class)
lanzará la excepciónNullPointerException
en caso de quecar
no esté apuntando a ningún objeto (es decir, tenga una referencia nula). Por lo tanto, se debe colocar un cheque nulo adicional con esto, por ejemplo,car != null && car.getClass().equals(Car.class)
para evitar quecar != null && car.getClass().equals(Car.class)
deNullPointerException
. -
instanceof
operator le dice si un objeto es una instancia de una clase o sus clases primarias (hasta cualquier nivel). -
car.getClass().equals(Car.class)
dirá si un objeto es solo una instancia de la clase. (Las clases para padres y subdivisiones no serán consideradas en absoluto)
Si está buscando una coincidencia de clase exacta, el único medio es qux.getClass().equals(Foo.class)
. instanceof también devolverá true para las subclases.
Si tiene que hacer esto, la única forma sería la getClass().equals(Foo.class)
que ha sugerido.
Sin embargo, el objetivo del diseño OO es permitirle tratar a cualquier Foo
de la misma manera. Si la instancia es o no una subclase debe ser irrelevante en un programa normal.
deberías usar instanceof
if(qux instanceof Foo && !(qux instanceof Bar)) {
...
}
Esto funciona con ambas clases e interfaces, por lo que en la mayoría de los casos debería preferirse a .class
que no funciona con interfaces.
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);
}
}