Estou trabalhando com Java e tentando usar"instanceof" para determinar se um objeto retornado é uma instância em uma classe. O código (não o meu código) com o qual tenho que trabalhar é apresentado dessa maneira. A questão é por que instanceof não pode ser convertido corretamente para determinar se o objeto é uma instância da classe?
public class MainClass{
public static void main(String[] args){
Class1 myClass1 = new Class1();
if(myClass1.getObject() instanceof Class1){} ///<--- Cast Error
}
}
public class Class1 extends ObjectClass{
public InnerClass1 getObject(){
return (InnerClass1)object;
}
public static abstract class InnerClass1 extends Class2{}
}
public class Class2 {}
public class ObjectClass {
final Class2 object = new Class2();
}
Como você pode ver, o objeto é uma instância deClass2. Ao chamar o método "get", ele lança o objeto para digitar InnerClass1, que estende a Class2. InnerClass1 é uma subclasse de Class1. A verificação "instanceof" deseja verificar se o objeto é uma instância da Class1, mas falha com um erro não pode ser convertido. Por que é isso? Obrigado pela ajuda.
---EDITAR--- Apenas um lembrete, este NÃO é o meu código. Foi-me dado isso para trabalhar e estava tendo alguma dificuldade em analisar por que a instância do não estava funcionando. As respostas foram ótimas e eu entendo agora. Obrigado!
Respostas:
1 para resposta № 1InnerClass1 é uma subclasse de Class1
Não InnerClass1 extends Class2
não Class1
, Além disso Class2
não estende nenhuma classe, portanto ela não pode ser um subtipo explícito ou implícito de Class1
o que significa que a cotação acima está incorreta.
De qualquer forma em
myClass1.getObject() instanceof Class1
você está verificando se o resultado de myClass1.getObject()
é subtipo de Class1
.
Mas o compilador sabe que getObject()
é declarado como
public InnerClass1 getObject(){..}
por isso devo instância de retorno de InnerClass1
ou seu subtipo. Mas desde InnerClass1
e Class1
não são relacionado e eles não podem ter ancestral comum nem filho comum (não há herança múltipla em Java para classes, portanto, qualquer subclasse pode ter apenas uma classe pai), é impossível ter instância de InnerClass1
(ou seu subtipo), que também será do tipo Class1
.
Portanto, como essa instância não pode existir (não estou incluindo null
aqui) o compilador não permite escrever código com base na suposição de que essa instância possa existir.