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:
- Toma una captura de pantalla en Android
- Generar un color aleatorio Java
- Org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Campo no reconocido "id" (Criterios de clase), no marcado como ignorable
- Programe un par de dispositivos Bluetooth sin que el usuario introduzca el pin
- Cabecera Content-Length ya presente
- 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)
- Android: CursorLoader, LoaderManager, SQLite
- Error: Error de ejecución para la tarea ': app: mergeDebugResources'. > Se ha producido un error en el procesamiento de archivos, vea los registros para obtener detalles.
- Error de java.lang.outofmemory (servicios web) en android
- Archivo de lectura / escritura .txt con caracteres especiales
- Reproducción de MediaPlayer de Android tartamudea sobre auriculares con cable, no sobre Bluetooth
- Formato Doble para imprimir sin notación científica usando DecimalFormat
- Mensaje emergente de Android Eclipse con el botón
- ¿Por qué la verificación de firma en el servidor remoto es más segura que en el dispositivo?
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-:
-
instanceof
operadorinstanceof
no lanzará la excepciónNullPointerException
en caso de que la variable de referencia no esté apuntando a ningún objeto (es decir, que tenga referencia nula). -
car.getClass().equals(Car.class)
lanzará la excepciónNullPointerException
en caso de que elcar
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 ejemplocar != null && car.getClass().equals(Car.class)
para evitarlo deNullPointerException
. -
instanceof
operador indica si un objeto es una instancia de una clase o de sus clases padre (hasta cualquier nivel). -
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)
- Guardar / Crear MMS en la bandeja de entrada de Android
- ¿Cuál es la manera más rápida de raspar la página web HTML en Android?