tipos que polimorfismo objetos objeto getclass ejemplos ejemplo como castear java instanceof

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-:

  1. instanceof operator no lanzará la excepción NullPointerException en caso de que la variable de referencia no apunte a ningún objeto (es decir, tenga referencia nula).
  2. car.getClass().equals(Car.class) lanzará la excepción NullPointerException en caso de que car 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 que car != null && car.getClass().equals(Car.class) de NullPointerException .
  3. instanceof operator le dice si un objeto es una instancia de una clase o sus clases primarias (hasta cualquier nivel).
  4. 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); } }