5
respostas

Esse cast compila. Por quê?

Nesse exercício vimos esse exemplo que compila normalmente:

interface Z {}
interface W {}
interface Y extends Z, W {}
class B {}
class C extends B implements Y {}
class D extends B implements Z, W {}
class E extends C {}
class A {
    public static void main(String[] args) {
        C c = (C) new B();
    }
}

Na hora que estava analisando o código tive a seguinte conclusão: Bem, o compilador deveria saber que o que está sendo feito o cast atribuido a variável C é um B e não pode ser outra coisa pois o objeto é criado na mesma linha. Não foi colocado em uma variável e depois atribuida a variável c. Qual é a lógica que o compilador usa para deixar que esse código compile?

5 respostas

Ele teria mais trabalho do que o necessário para verificar isso... Um B, pode ser um C, é o que basta para ele... Tipo, neste caso inline ele poderia até ter um trabalho a mais, mas para que? Percebe que é um caso bem específico..

Confesso que também não entendi muito bem a regra de casting para uma classe mais específica. Quando é permitido o cast, quando dá erro de compilação e quando só dá erro em tempo de execução.

Cast tem a ver sobre a possibilidade de referenciar. No caso acima, existe a possibilidade de um B ser um C? Sim, existe. Dado que C herda de B.

A parte de estar na mesma linha é indiferente...

Também ainda estou com muitas dúvidas nesse exemplo. Preciso entender porque a falha é só verificada em tempo de execução e não de compilação, alguém se habilita a me dar mais detalhes pra eu tentar entender o compilador? Ao meu ver é bem óbvio que B nem sempre será do tipo C, pois, ele também pode assumir o tipo D e por isso o erro já deveria ser acusado em tempo de compilação e não apenas em execução.

A meu ver, a explicação que tenho é que o compilador está verificando apenas se o tipo que vc está fazendo é compatível com o tipo que está recebendo. Como (C) é um C, então compila de boa. Quando roda, e que o objeto em questão vai ser criado (new B()), é que vai ser verificado que B não é um C.