Operador ternário vs. instrução if para retorno nulo de int
Em Java, o operador ternário (?:) permite a atribuição de null para uma variável do tipo int, mesmo que int seja um tipo de dados primitivo que não suporta valores nulos. Considere o seguinte trecho de código:
int temp() {
return true ? null : 0;
}
Neste código, o operador ternário atribui nulo à variável temp se true for a condição avaliada, caso contrário, atribui 0. O compilador permite esta atribuição sem emitir nenhum erro. No entanto, quando o método é executado, ele lançará uma NullPointerException em tempo de execução porque null não é um valor válido para int.
Em contraste com o operador ternário, a instrução if não permite tais atribuições nulas a variáveis de tipos primitivos. Por exemplo:
int same() {
if (true) {
return null;
} else {
return 0;
}
}
Este código irá gerar um erro em tempo de compilação com a mensagem "tipos incompatíveis: null não pode ser convertido em int." A razão para essa discrepância está na maneira como o compilador trata o valor nulo.
No caso do operador ternário, o compilador interpreta o literal nulo como uma referência nula a um Inteiro, a classe wrapper para int. Isso se deve às regras do compilador para autoboxing e unboxing: ao converter de um tipo primitivo para um tipo de objeto, a Java Virtual Machine (JVM) envolve automaticamente o valor primitivo no wrapper de objeto correspondente.
Como int é um wrapper de objeto correspondente. tipo primitivo, o compilador tentará desempacotar o valor nulo retornado pelo operador ternário, o que resulta em NullPointerException.
Por outro lado, a instrução if faz não execute esse processo de unboxing e o literal nulo permanecerá como uma referência nula para Object. Como o tipo de retorno do método same() é int, o compilador não pode converter a referência nula em int, daí o erro em tempo de compilação.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3