Me gustaría saber sobre el siguiente comportamiento del instanceofoperador en Java.
interface C {}
class B {}
public class A {
public static void main(String args[]) {
B obj = new B();
System.out.println(obj instanceof A); //Gives compiler error
System.out.println(obj instanceof C); //Gives false as output
}
}
¿Por que es esto entonces? No hay relación entre interface Cy class B, pero da falso mientras que en caso de obj instanceof Ada error de compilador
java
class
inheritance
interface
instanceof
Ajay Sharma
fuente
fuente

Object obj = new B(), se compila.class Besfinalentoncesobj instanceof Ctampoco se compilará, porque si noBpuede tener subtipos, se garantiza que no está relacionado conC.Respuestas:
Debido a que Java no tiene herencia de clases múltiples, se sabe absolutamente durante la compilación que el
objobjeto de tipoBno puede ser un subtipoA. Por otro lado, posiblemente puede ser un subtipo de interfazC, por ejemplo en este caso:interface C {} class B {} class D extends B implements C {} public class A { public static void main(String args[]) { B obj = new D(); System.out.println(obj instanceof C); //compiles and gives true as output } }Por lo tanto, mirar solo el
obj instanceof Ccompilador de expresiones no puede decir de antemano si será verdadero o falso, pero al mirarloobj instanceof Ase sabe que esto siempre es falso, por lo que no tiene sentido y le ayuda a evitar un error. Si aún desea tener esta verificación sin sentido en su programa, puede agregar una conversión explícita aObject:System.out.println(((Object)obj) instanceof A); //compiles finefuente
A.class.isAssignableFrom(obj.getClass())Java has no multiple class inheritancesí, estoy de acuerdo, pero cómo se aplica en este caso porque ni B ni A extienden nada, así que ¿por qué herencias múltiples aquí. Sería útil si pudiera explicarlo?B extends A. En mi vida, de hecho, necesitaba hacer comprobaciones y lanzamientos tan raros como(A)(Object)bsi en tiempo de ejecución fuera posible ser verdad.Al usar el
finalmodificador en la declaración de clase a continuación, se garantiza que no puede haber una subclase deTestque pueda implementar la interfazFoobar. En este caso, es obvio queTestyFoobarno son compatibles entre sí:public final class Test { public static void main(String[] args) { Test test = new Test(); System.out.println(test instanceof Foobar); // Compiler error: incompatible types } } interface Foobar { }De lo contrario, si
Testno se declarafinal, es posible que una subclase deTestimplemente la interfaz. Y es por eso que el compilador permitiría la declaracióntest instanceof Foobaren este caso.fuente