Dúvida em autoboxing simples

6 respostas
T
Fiquei com uma dúvida agora no seguinte autoboxing:
public class ShortTest
{
	public static void main(String...$){
		
		Short s = 5;

		System.out.println("s: "+s);
	}
}

Por que isso funciona normalmente? O que eu achava que acontecia era o seguinte:

1) 5 é um literal do tipo int (pois foi escrito diretamente no código fonte).
2) Assim, como Short é um tipo não primitivo, é necessário fazer o autoboxing do 5.
3) 5 é transformado em um objeto do tipo Integer.
4) Integer não é subclasse de Short, logo gera erro de compilação.

Qual o erro no racioncínio?

6 Respostas

V

o código funciona normalmente porq 5 está nos limites permitidos no tipo short…

E

Lendo a JLS, no capítulo “Conversions” (http://java.sun.com/docs/books/jls/third_edition/html/conversions.html ) é realmente difícil entender por que é que isso ocorre (você sabe que existe o “compile-time narrowing”, o que possibilita você escrever:

short s = 5;

mesmo sendo 5 um int, converte-se implicitamente o 5 para um short, porque o valor é pequeno suficiente para caber em um primitivo short.

Acredito que seja aceito o “Short s = 5” pelo “princípio de mínima surpresa” (principle of least surprise) porque é realmente difícil entender por que é que é válido usar “short s = 5” mas não seja válido usar “Short s = 5”. É questão de ler com mais atenção a JLS.

E não, tais coisas absurdas não caem com tal nível de detalhamento.

rmala_ti

Pessoal, e qual o motivo que esse não funciona?

Num tem cast implícito de int pra short, não?

rmala_ti

Olhando a API, só aceita short, vejam:

static Short valueOf(short s)
Returns a Short instance representing the specified short value.

Short(short value)
Constructs a newly allocated Short object that represents the specified short value.

Tudo bem, mas o que intriga é que o cast implícito ocorre quando faz

V

rmalati:
Pessoal, e qual o motivo que esse não funciona?

Num tem cast implícito de int pra short, não?


de uma olhada no construtor de Short

public Short(short value);

ou seja vc tem que fazer isso na hora de criar

//isso impede que vc passe um valor fora dos limites do tipo short....
new Short((short)5);

ou 

short x = 5;

new Short(x);
T

Outra coisa que me deixa com a pulga atrás da orelha é que isso não compila:

Long x = 42;

Mas isso compila:

Alguém sabe explicar o porquê?

Criado 9 de fevereiro de 2010
Ultima resposta 10 de fev. de 2010
Respostas 6
Participantes 4