2
respostas

Erro em tempo de compilação

D d = (D) (Y) (B) new D();

// Nesse caso D não implementa Y. Porquê o compilador não conseguiu pegar esse erro em tempo de compilação?
2 respostas

Olá Manoel,

O compilador só consegue trabalhar com aquilo que ele tem certeza no momento da compilação. Como uma classe pode implementar quantas interfaces quiser, podemos ter alguma situação onde carregamos uma classe em tempo de execução que seja filha de D e implemente Y. Nesse caso, o casting dessa classe para Y seria viável. Se o compilador gerasse um erro baseando-se somente na classe D sem considerar possíveis filhas, acabaríamos perdendo esse comportamento.

Uma maneira de fazer o compilador ter certeza que esse casting é impossível é fazer a classe D se tornar final. Nesse caso, a classe D não pode ser herdada então se ela não implementa Y e não pode ter filhas então o compilador consegue afirmar com certeza que o casting é impossível.

Olá Manoel, tudo bem?

Neste caso, como D não é uma classe final o compilador entende que pode existir uma filha de D que implementa Y e que essa filha está sendo passada por polimorfismo. Por isso não ocorre erro em tempo de compilação.