Compruebe si un objeto es una instancia de una clase (pero no una instancia de su subclase)

Para este ejemplo:

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

¿Cómo puedo comprobar 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) = false

¿Existe algún tipo de declaración como instanceof para esta comprobación? O debería usar qux.getClass().equals(Foo.class)

Si tiene que hacer esto, la única manera sería la getClass().equals(Foo.class) que ha sugerido.

Sin embargo, el objetivo del diseño OO es permitir que usted trate a cualquier Foo de la misma manera. Sea o no la instancia es una subclase debe ser irrelevante en un programa normal.

Si está buscando una coincidencia de clase exacta, el único medio es qux.getClass().equals(Foo.class) . Instanceof también devolverá true para subclases.

Deberías usar instanceof

 if(qux instanceof Foo && !(qux instanceof Bar)) { ... } 

Esto funciona con las clases y las interfaces, por lo que en la mayoría de los casos se debe preferir. .class que no funciona con las 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); } } 

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

Bueno ya sabes que qux es instanceof Foo (a menos que sea nulo …), por lo que una simple qux instanceof Bar y un cheque nulo debe ser todo lo que necesita.

He leído todas las respuestas que han sido publicadas hasta ahora pero aún no he encontrado una respuesta satisfactoria. Respuesta a ¿Existe algún tipo de declaración como instanceof para este cheque? O debería usar qux.getClass().equals(Foo.class) pregunta Yo diría que sí, hay operador instanceof en java para comprobar si el objeto es 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 

Description-: instanceof operador indica si un objeto es una instancia de una clase o de sus clases padre (hasta cualquier nivel).
vehicle instanceof Car : FALSE línea de salida vehicle instanceof Car : FALSE 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 a continuación el 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-: A partir del ejemplo anterior quedaría claro cuál de los dos (entre los dos) debe ser elegido donde?

Notas importantes-:

  1. instanceof operador instanceof no lanzará la excepción NullPointerException en caso de que la variable de referencia no esté apuntando a ningún objeto (es decir, que tenga referencia nula).
  2. car.getClass().equals(Car.class) lanzará la excepción NullPointerException en caso de que el car no esté apuntando a ningún objeto (es decir, que tenga referencia nula). Por lo tanto, se debe colocar un cheque nulo adicional con esto por ejemplo car != null && car.getClass().equals(Car.class) para evitarlo de NullPointerException .
  3. instanceof operador indica si un objeto es una instancia de una clase o de sus clases padre (hasta cualquier nivel).
  4. car.getClass().equals(Car.class) le dirá si un objeto es una instancia de clase solamente. (Las clases de padres y subgrupos no serán consideradas en absoluto)
  • Cómo guardar la superposición con vista previa de la cámara en android?
  • No se puede encontrar el diseñador de interfaz de usuario en el nuevo estudio de Android
  • No puede enviar mensajes desde el servidor: Google Cloud Messaging
  • Utilizando gps en un mapa estático en android?
  • Android no puede analizar cadena hasta la fecha
  • Java.lang.UnsatisfiedLinkError: No se pudo cargar stlport_shared: findLibrary devuelto null (tess-two)
  • Android: Diferencia entre getCount () y getChildCount () en ListView
  • Cómo puedo extraer datos rtsp en MediaCodec
  • UUID.fromString () devuelve un UUID no válido?
  • SwitchPreference y CheckBoxPreference en el código
  • Invertir colores de mapa de bits
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.