utiliza que para operador objetos objeto metodo getclass ejemplo como castear java class inheritance interface instanceof

que - metodo equals string java



El operador ''instanceof'' se comporta de manera diferente para interfaces y clases (2)

Me gustaría saber sobre el siguiente comportamiento del operador instanceof 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 la interface C y la class B , pero da falso mientras que en caso de obj instanceof A da error de compilación?


Al usar el modificador final en la declaración de clase a continuación, se garantiza que no podría haber una subclase de Test , que puede implementar la interfaz Foobar . En este caso, es obvio que Test y Foobar no 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 Test no se declara final , es posible que una subclase de Test implemente la interfaz. Y es por eso que el compilador permitiría la test instanceof Foobar declaración de test instanceof Foobar en este caso.


Debido a que Java no tiene herencia de clases múltiples, es absolutamente conocido durante la compilación que el objeto obj de tipo B no puede ser un subtipo de A Por otro lado, posiblemente puede ser un subtipo de interfaz C , 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, al observar solo la obj instanceof C compilador de expresiones obj instanceof C no se puede saber de antemano si será verdadero o falso, pero al observar la obj instanceof A se 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 al Object :

System.out.println(((Object)obj) instanceof A); //compiles fine