Eu gostaria de saber a respeito do seguinte comportamento do instanceof
operador em 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 é tão? Não há relação entre interface C
e class B
, mas dá falso enquanto que no caso de obj instanceof A
dá erro do compilador?
java
class
inheritance
interface
instanceof
Ajay Sharma
fonte
fonte
Object obj = new B()
, ele compila.class B
for,final
entãoobj instanceof C
também não compilará, porque se nãoB
puder ter subtipos, é garantido que ele não esteja relacionado aC
.Respostas:
Como o Java não tem herança múltipla de classes, é absolutamente conhecido durante a compilação que o
obj
objeto do tipoB
não pode ser um subtipoA
. Por outro lado, possivelmente pode ser um subtipo de interfaceC
, por exemplo neste caso:Portanto, olhar apenas para o
obj instanceof C
compilador de expressão não pode dizer com antecedência se será verdadeiro ou falso, mas olhar paraobj instanceof A
ele sabe que isso é sempre falso, portanto, sem sentido e ajuda a evitar um erro. Se você ainda deseja ter essa verificação sem sentido em seu programa, você pode adicionar uma transmissão explícita aoObject
:fonte
A.class.isAssignableFrom(obj.getClass())
Java has no multiple class inheritance
sim, eu concordo, mas como isso é aplicado neste caso porque nem B nem A estendem nada, então por que herança múltipla aqui. Seria útil se você pudesse explicar?B extends A
. Na minha vida, eu realmente precisava fazer verificações e projeções estranhas,(A)(Object)b
como no tempo de execução, era realmente possível ser verdade.Ao usar o
final
modificador na declaração de classe abaixo, é garantido que não poderia haver uma subclasse deTest
, que pode implementar a interfaceFoobar
. Nesse caso, é óbvio queTest
eFoobar
não são compatíveis entre si:Caso contrário, se
Test
não for declaradofinal
, pode ser possível que uma subclasse deTest
implemente a interface. E é por isso que o compilador permitiria a declaraçãotest instanceof Foobar
neste caso.fonte