Questão de Programação — Programação Orientada a Objetos — INSTITUTO AOCP 2025
Programação›Programação Orientada a Objetos
Código
qg543500
Banca
INSTITUTO AOCP
Órgão
TRE-TO
Ano
2025
Nível
Superior
Cargo
Analista Judiciário - Área de Atividade: Apoio Especializado - Especialidade: Tecnologia da Informação
A respeito do seguinte trecho de código Java, assinale a alternativa correta.public class ExemploErro {public static void exibir(Integer valor) {System.out.println(“Valor inteiro: ” + valor);}public static void exibir(double valor) {System.out.println(“Valor decimal: ” + valor);}public static void main(String[] args) {exibir(null);}}
AO código apresenta erro em tempo de compilação por ambiguidade: o compilador não consegue decidir entre exibir(Integer) e exibir(double) para o argumento null.
BO método exibir(double) não pode ser sobrecarregado com exibir(Integer), pois Integer é um tipo primitivo e double é um wrapper.
CO código compila e executa normalmente, imprimindo “Valor inteiro: null”.
DO método main está incorreto, pois não é permitido passar valores null para métodos sobrecarregados.
EO compilador automaticamente converte null para double, e o método exibir(double) é executado com valor 0.0.
Revelar gabarito e comentário▾
GabaritoA — O código apresenta erro em tempo de compilação por ambiguidade: o compilador não consegue decidir entre exibir(Integer) e exibir(double) para o argumento null.
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
Sobrecarga de Métodos e Ambiguidade em Java
Gabarito: letra A. O código apresenta erro de compilação por ambiguidade: ao chamar exibir(null), o compilador não consegue decidir entre exibir(Integer) e exibir(double), pois null é compatível com o tipo referência Integer e também pode ser convertido (via unboxing) para o tipo primitivo double. Essa é uma regra clássica de resolução de sobrecarga em Java, prevista na especificação da linguagem (JLS).
A sobrecarga de métodos (overload) é um dos pilares do polimorfismo estático em Java: permite que uma classe tenha vários métodos com o mesmo nome, mas com listas de parâmetros diferentes. O compilador escolhe qual método invocar com base nos argumentos passados na chamada. Quando há apenas um método compatível, a escolha é trivial. O problema surge quando existem dois ou mais métodos igualmente aplicáveis — e é exatamente isso que ocorre aqui.
No trecho, temos dois métodos sobrecarregados: exibir(Integer) e exibir(double). A chamada exibir(null) é ambígua porque null é um valor especial que pode ser atribuído a qualquer tipo referência (como Integer) e, por meio de unboxing, também pode ser convertido para um tipo primitivo (como double). O compilador Java, ao resolver a sobrecarga, segue uma ordem de precedência: primeiro tenta a fase de aplicação estrita (sem boxing/unboxing), depois a fase de aplicação por boxing/unboxing e, por fim, a fase de aplicação por varargs. Neste caso, Integer é aplicável na primeira fase (null é um literal de referência), e double é aplicável na segunda fase (via unboxing de Double para double). Como ambos os métodos são aplicáveis em fases diferentes, e a fase 1 tem precedência sobre a fase 2, o compilador deveria escolher exibir(Integer). No entanto, a especificação da linguagem Java (JLS 15.12.2) determina que, se houver mais de um método aplicável na fase mais específica, e nenhum for mais específico que o outro, ocorre erro de compilação por ambiguidade. Aqui, exibir(Integer) e exibir(double) não são comparáveis em termos de especificidade: Integer é um tipo referência e double é um tipo primitivo, e não há relação de subtipo entre eles. Portanto, o compilador não consegue decidir e gera o erro.
Na prática, esse é um erro comum em Java, e a solução é evitar chamadas ambíguas, por exemplo, fazendo um cast explícito: exibir((Integer) null) ou exibir((double) 0). A banca explora exatamente esse conhecimento técnico: a diferença entre tipos primitivos e wrappers, e como o compilador resolve sobrecargas.
Guarde o critério decisivo: a ambiguidade ocorre quando dois métodos sobrecarregados são igualmente aplicáveis e não há um mais específico. É essa regra que separa as alternativas corretas das incorretas.
Sobrecarga de métodos: Resolução pelo compilador (Fase 1: aplicação estrita, Fase 2: boxing/unboxing, Fase 3: varargs); Ambiguidade (Dois métodos igualmente aplicáveis, Nenhum mais específico, Erro de compilação); Exemplo: exibir(null) (Integer (referência), double (primitivo, via unboxing), Ambíguo)
Alternativa A — ✅ Correta ⟵ GABARITO
A alternativa afirma que o código apresenta erro de compilação por ambiguidade, pois o compilador não consegue decidir entre exibir(Integer) e exibir(double) para o argumento null. Isso está correto. Como explicado, null é compatível com Integer (tipo referência) e, via unboxing, com double (tipo primitivo). Como nenhum dos dois métodos é mais específico que o outro, o compilador não consegue resolver a sobrecarga e gera erro de compilação. Essa é a regra da JLS para resolução de sobrecarga.
Alternativa B — ❌ Incorreta
Afirma que exibir(double) não pode ser sobrecarregado com exibir(Integer), pois Integer é um tipo primitivo e double é um wrapper. O erro está na inversão dos conceitos: Integer é um wrapper (classe que encapsula o primitivo int), e double é um tipo primitivo. Além disso, a sobrecarga entre um tipo primitivo e um wrapper é perfeitamente válida em Java — o que causa o erro não é a sobrecarga em si, mas a chamada ambígua com null.
Alternativa C — ❌ Incorreta
Afirma que o código compila e executa normalmente, imprimindo "Valor inteiro: null". Isso é falso: o código não compila, pois há erro de ambiguidade na chamada exibir(null). Se não houvesse ambiguidade (por exemplo, se só existisse exibir(Integer)), a saída seria "Valor inteiro: null", mas com os dois métodos sobrecarregados, o compilador rejeita o código.
Alternativa D — ❌ Incorreta
Afirma que o método main está incorreto, pois não é permitido passar valores null para métodos sobrecarregados. Isso é falso: é perfeitamente permitido passar null para métodos sobrecarregados, desde que não haja ambiguidade. O problema não está no main, mas na resolução da sobrecarga. Se houvesse apenas um método compatível, null seria aceito normalmente.
Alternativa E — ❌ Incorreta
Afirma que o compilador converte automaticamente null para double, e o método exibir(double) é executado com valor 0.0. Isso é falso: null não pode ser convertido para double (nem para qualquer tipo primitivo) sem gerar erro. A conversão de null para um tipo primitivo resultaria em NullPointerException em tempo de execução, mas aqui o problema ocorre antes, em tempo de compilação, devido à ambiguidade. O compilador não escolhe automaticamente double; ele simplesmente não consegue decidir.
NÃO CAIA NESSA!
A banca explora a confusão entre tipos primitivos e wrappers. Muitos candidatos pensam que null só pode ser passado para Integer (por ser referência) e ignoram que o compilador também considera a conversão via unboxing para double. O erro de compilação por ambiguidade é a consequência direta dessa dupla possibilidade. Fique atento: quando há dois métodos sobrecarregados, um com wrapper e outro com primitivo, e a chamada usa null, o compilador não consegue resolver — é uma pegadinha clássica.
PEGA ESSA DICA!
Para resolver questões de sobrecarga, verifique sempre se há mais de um método aplicável. Se houver, analise a especificidade: um método é mais específico que outro se os parâmetros dele podem ser passados para o outro (ex.: Integer é mais específico que Number). Se nenhum for mais específico, há ambiguidade e erro de compilação. Na prova, desconfie de alternativas que afirmam que o código compila ou que null é convertido para primitivo — isso raramente é verdade.