El operador ‘instanceof’ se comporta de manera diferente para interfaces y clases

Me gustaría saber sobre el comportamiento siguiente 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 el caso de obj instanceof A , ¿da error del comstackdor?

Debido a que Java no tiene herencia de clase múltiple, es absolutamente conocido durante la comstackción que el objeto obj de tipo B no puede ser 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 } } 

Así que mirando solo a obj instanceof C comstackdor de expresiones obj instanceof C no puede decir con anticipación si será verdadero o falso, pero mirando el obj instanceof A sabe que esto siempre es falso, sin sentido y ayuda a prevenir un error. Si aún desea tener esta verificación sin sentido en su progtwig, puede agregar una conversión explícita al Object :

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

Al usar el modificador final en la siguiente statement de clase, 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 comstackdor permitiría la test instanceof Foobar statement de test instanceof Foobar en este caso.