Questão nº 47
Questão de Tecnologia da Informação · CESGRANRIO BASA 01/2018 (nº 47)
Considere a hierarquia de classes mostrada na Figura a seguir:

Considere agora o seguinte fragmento de código Java baseado na hierarquia anterior:
public class Main {
public static void main(String[] args) {
Caminhao caminhao = new Caminhao(); // linha 1
IVeiculo veiculo = caminhao; // linha 2
QuatroRodas fw = new Guindaste(); // linha 3
fw = veiculo; // linha 4
veiculo = fw; // linha 5
}
}
A linha marcada por um comentário que causará um erro em tempo de compilação é a linha
- A1
- B2
- C3
- D4 (alternativa correta)
- E5
Resposta comentada
Gabarito Alternativa D
Conceito-chave: Em Java, o tipo da variável define quais métodos podem ser chamados e qual tipo de objeto ela pode referenciar. A atribuição variavel = objeto só compila se o tipo da variável for superclasse (ou interface) do tipo do objeto, nunca o contrário (a menos que haja cast explícito).
- (A) Incorreta:
Caminhao caminhao = new Caminhao();é válido, pois a variável é do mesmo tipo do objeto instanciado. - (B) Incorreta:
IVeiculo veiculo = caminhao;é válido, poisCaminhaoimplementaIVeiculo(a interface é supertipo), então há upcast implícito. - (C) Incorreta:
QuatroRodas fw = new Guindaste();é válido, poisGuindasteé subclasse deQuatroRodas(upcast implícito). - (D) Correta:
fw = veiculo;gera erro de compilação porqueveiculoé do tipoIVeiculo(interface) efwé do tipoQuatroRodas(classe). O compilador não sabe se o objeto referenciado porveiculoé umQuatroRodasou outro tipo deIVeiculo(ex.:Caminhao), então downcast sem cast explícito é proibido. A pegadinha é que, emboraveiculoaponte para umCaminhao(que éQuatroRodas), o tipo estático da variável éIVeiculo, e o compilador só analisa tipos declarados, não objetos em tempo de execução. - (E) Incorreta:
veiculo = fw;é válido, poisQuatroRodasimplementaIVeiculo(upcast implícito defwparaIVeiculo).
Fonte: CESGRANRIO BASA 01/2018 Técnico Científico - Área de Formação: Tecnologia da Informação. Reproduzida para fins de estudo.