Questão Caelum Mock, atribuir um primitivo à uma referência

3 respostas
D

Olá Pessoal,

A seguinte questão do Caelum Mock diz que a resposta correta é a resposta marcada em vermelho. Eu marquei a resposta em azul e compilei o código usando as versões 1.5 e 1.6 sem problemas. Não entendi a marcação dessa resposta, alguém têm alguma idéia do porquê da resposta ou a resposta está errada mesmo?

[ ] false true true java.lang.Object true false false
[color=blue][x] true false true java.lang.Double true true false[/color]
[ ] O código não compila pois não podemos comparar referências com o sinal ‘<’.
[color=red][x] O código não compila pois não podemos atribuir um tipo primitivo com uma referência.[/color]
[ ] false false true java.lang.Object false true false

public class TesteQualquer {

	public static void main(String[] args) {
		  System.out.println(5 < new Integer(6));  
		  System.out.println(new Integer(6) == new Integer(6));  
		  System.out.println(new Integer(5) < new Integer(6));  
		    
		  Object o = 54.5;  
		  System.out.println(o.getClass().getName());  
		    
		  Boolean b = false;  
		  System.out.println(b==false);  
		  System.out.println(b==Boolean.FALSE);  
		  System.out.println(b==new Boolean(false)); 

	}

}

Valeu,
Denis

3 Respostas

bzy

Ele erraram e você acertou.

D

Opa,

Faltou colocar a explicação da resposta , abaixo.

Explicação sobre a resposta

No Java 5, quando comparamos um tipo primitivo com sua classe Wrapper com o operador "==", ele faz o unboxing do tipo primitivo e compara, não suas referências, mas sim seus valores. Mas, por motivo de compatibilidade, quando comparamos dois objetos, mesmo sendo classes Wrappers, o Java continua comparando referências.
Tenho a suspeita que a idéia da questão era testar que a linha abaixo imprime false porquê não ocorre o unboxing da classe Wrapper Boolean por motivo de compatibilidade, mas isso não faria com que o código não compilasse com o Java 5.
System.out.println(b==new Boolean(false));

Essa sim seria uma questão interessante.
Ou seja, no código no final da mensagem, se compararmos as variáveis b ou bool com new Boolean(false), não ocorre o boxing/unboxing de nenhum dos lados da igualdade em nenhum dos casos por questão de compatibilidade, é isso mesmo pessoal?

public static void main(String[] args) {
		  
		Boolean b = false;  
		Boolean bool = false;
		
		System.out.println(b==false);
		System.out.println(bool==false);
		
		System.out.println(b==Boolean.FALSE);
		System.out.println(bool==Boolean.FALSE);
		
		System.out.println(b==new Boolean(false)); 
		System.out.println(bool==new Boolean(false));

		System.out.println(new Boolean(false)==new Boolean(false));
	}

Mas ao comparar a variável bool com "false", aí sim ocorreria o unboxing de bool.

D

resultado da execução do último código do meu último post:
true
true
true
true
false
false
false

Criado 28 de setembro de 2010
Ultima resposta 28 de set. de 2010
Respostas 3
Participantes 2