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