Uma questão leve sobre Wrappers

23 respostas
marciolx

dado o código abaixo, seleciona todas as alternativas corretas:

a - erro de compilação na linha 4
b - erro de compilação na linha 7
c - compila, roda e lança runtime exception
d - compila, roda e imprime true
e - compila, roda e imprime false

1 public class Teste09 {
2 	boolean b;
3 	public void metodo() {
4 		Character c = new Character ("A");
5 		Long l = new Long(65);
6 		Integer i = new Integer(65);
7 		b = i == l;
8 	}
9 	public boolean getB() {
10 		return b;
11 	}
12 	public static void main (String [] args) {
13 		Teste09 t = new Teste09();
14 		System.out.println (t.getB());
15 	}
16 }

23 Respostas

ricardolecheta

erro de compilação na linha 4 :smiley:

os wrappers Integer, Float, Double,Boolean possuem um construtor que recebe uma String…

mas o wrapper Character só possui um construtor que recebe um char :!:

R

Creio que não se pode estanciar um char com String-linha 4,nem atribuir a um boolean um inteiro-linha 7.Não Compila

marciolx

“ricardolecheta”:

mas o wrapper Character só possui um construtor que recebe um char :!:

ok, e nunca se esqueça disso :slight_smile:

marciolx

você acertou, erro de compilação nas linhas 4 e 7, mas no caso da linha 7, o boolean NÃO está recebendo um valor inteiro, ele está recebendo o resultado da comparação com == (que é sempre um boolean) entre um wrapper Integer e um wrapper Long.

Isso é errado porque Integer e Long não estão na mesma hierarquia, ambas são subclasses da classe abstrata java.lang.Number, mas uma referência do tipo Integer nunca pode referenciar um objeto do tipo Long.

Ocorre o mesmo com o operador instanceof, veja o código abaixo:

class B {}
class S extends B {}
class C {}

public class TesteCast {
	public static void main (String [] args) {
		B b = new B();
		S s = new S();
		C c = new C();
		System.out.println (s instanceof B);
		System.out.println (c instanceof B); // este
	}
}

nele, o System.out.println que está comentado com //este resulta em um erro de compilação, isto porque objetos das classes C e B não apresentam qualquer relação de herança (mesmo remota, como seria o caso de Object e S, por exemplo).

R

Marciolix Explicação brilhante.Eu não tinha percebido que estava-se atribuindo uma igualdade a um boolean e se a igualdade fosse válida eu teria errado a resposta.

ricardolecheta

é isso aí marciolx!

continue trazendo questões assim! tá me ajudando muito :smiley:

caiofilipini

é isso aí marciolx!

continue trazendo questões assim! tá me ajudando muito :D

Opa, e a mim também! :smiley:

[]'s

marciolx

é isso aí marciolx!

continue trazendo questões assim! tá me ajudando muito :D

Opa, e a mim também! :smiley:

[]'s

e a mim também :smiley: :smiley:
falando sério… escrever e tentar compilar e rodar os programas é uma das melhores maneiras de aprender.

P

Cara, desse jeito vc pode criar seu próprio simulado e colocar na internet! :slight_smile:

passos

Cara… nunca tinha ouvido falar nisso… então quer dizer que pra uma classe estar num instanceof ela tem ao menos que pertencer a uma herança != de Object?

Java_Vinicius_Machin
class B {}
 class A {}
 class S extends B {}
 class C extends A {}
 
 public class TesteCast {
 	public static void main (String [] args) {
 		B b = new B();
 		S s = new S();
 		C c = new C();
 		System.out.println (s instanceof B);
 		System.out.println (c instanceof B); // este aqui tbm não compila
 	}
 }
Isso ae em cima tbm não compila então eu cheguei a conclusão que pra se utilizar o operador instanceof é necessário que o mesmo seja aplicado numa referencia que faça parte da hierarquia de classes e como no exemplo acima c não possui nenhum tipo de relacionamento com B ocorre um erro de compilação (os dois apenas são subclasses de Object como todas as outras classes em java)? Eh isso mesmo marciolx ? PS: voh pesquisar sobre o operador no livro da Kathy hoje a noite quando eu tiver um tempinho de sobre e posto mais coisinhas interessantes pra galera. :D
VantuilJose

marciolx:
dado o código abaixo, seleciona todas as alternativas corretas:

a - erro de compilação na linha 4
b - erro de compilação na linha 7
c - compila, roda e lança runtime exception
d - compila, roda e imprime true
e - compila, roda e imprime false

1 public class Teste09 { 2 boolean b; 3 public void metodo() { 4 Character c = new Character ("A"); 5 Long l = new Long(65); 6 Integer i = new Integer(65); 7 b = i == l; 8 } 9 public boolean getB() { 10 return b; 11 } 12 public static void main (String [] args) { 13 Teste09 t = new Teste09(); 14 System.out.println (t.getB()); 15 } 16 }

Só não entendi uma coisa, quando ele vai entrar nesse método que se chama “metodo”?
Se não houvessem os erros de compilação ele executaria normalmente?

diegobrandao

Olá,

Modifiquei um pouco o código para compilar…

public class Teste09 {
   boolean b;
   public void metodo() {
       Character c = new Character ('A');
       Long l = new Long(65);
       Long l2 = new Long(65);
       Integer i = new Integer(65);
       b = l == l2;
   }
   public boolean getB() {
      return b;
  }
  public static void main (String [] args) {
      Teste09 t = new Teste09();
      System.out.println (t.getB());
  }
 }

Ele não entra neste metodo() em momento algum. O código apenas chama o método getB() que rertona um boolean b, que no caso ainda é false (valor default).
ok?


Diego

VantuilJose

diegobrandao:
Olá,

Modifiquei um pouco o código para compilar…

public class Teste09 {
   boolean b;
   public void metodo() {
       Character c = new Character ('A');
       Long l = new Long(65);
       Long l2 = new Long(65);
       Integer i = new Integer(65);
       b = l == l2;
   }
   public boolean getB() {
      return b;
  }
  public static void main (String [] args) {
      Teste09 t = new Teste09();
      System.out.println (t.getB());
  }
 }

Ele não entra neste metodo() em momento algum. O código apenas chama o método getB() que rertona um boolean b, que no caso ainda é false (valor default).
ok?


Diego

Ahhh! é por que achei estranho, então no primeiro caso ele apenas imprimiria false ou daria erro de compilação? Qual seria realmente a resposta certa? é uma pegadinha? o realmente dá erro na compilação?

diegobrandao

Como já foi explicado acima o correto é: A,B
As linhas 4 e 7 não compilam.
Faça um teste na sua máquina que vc vai perceber o que acontece.

VantuilJose

Obrigado, Agora entendi, é que sou iniciante em java, e ainda falta muito o que aprender…

gabrielmassote

então marciolx, pelo que entendi, se eu tiver um Wrapper e for comparar com outro eles não compila. Mas se eu tiver um Wrapper e for campara-lo com um tipo primitivo ( que possa ser comparado com o wrapper em questão ) ele compilará. É isso?

Segue um exemplo parecido ao que postaram antes:

public class Ex4Wrapper {

    public Ex4Wrapper() {
    }
    
    public static void main(String [] args) {
    
    	Integer i = new Integer(12);
    	Float f = new Float(12.0);
    	
    	System.out.println(i == 12.0);
    	System.out.println(f == 12);
    	//System.out.println(i == f); não compila
    	    
    }
    
}

Abraço a todos.

diegobrandao

Olá, desculpa entrar na conversa…

É possível comparar Wrapper desde que sejam do mesmo tipo. Ex:

public class Ex4Wrapper {

    public Ex4Wrapper() {
    }

    public static void main(String [] args) {

        Integer i = new Integer(12);
        Float f = new Float(12.0);
        Integer i1 = new Integer(55);
        Integer i2 = new Integer(55);
        Long    i3 = new Long(55);

        System.out.println(i == 12.0);
        System.out.println(f == 12);
        //System.out.println(i == f); não compila

        System.out.println(i1 == i2);
    	// System.out.println(i1 == i3); //Não compila.

    }
}

Agora se tentar comparar por Ex. um Long com Integer não compila.
O que vc disse sobre comparar com um tipo primitivo é verdade, desde que seja possível fazer o auto-boxing.

gabrielmassote

Entendi.

Sobre tipos iguais já tinha visto que dava certo na boa e também sobre os tipos que eram possíveis fazerem auto-boxing.

Mas é um bom exemplo para o pessoal que tem a dúvida.

Agora outra questão rs:

Segue o exemplo:

Integer i = new Integer(15);
 
 if(i == 15) 
   System.out.println("true");

O que é feito? unboxing no Wrapper i ou boxing no primitivo 15?

Abraços.

Rocklee6544

Bom a primeira resposata minha foi false, já que quando vc não declara
nenhum valor para uma variável ela fica com o valor padrão.

No caso de booleanos =false
numeros 0
String e variáveis de referência null.

Ele compila o método Metodo não é chamado.
e mesmo que fosse b=l2==l ;
daria certo já que o operador de comparação retorna um false.
Mesmo sendo igual os valores as variáveis de referência são diferentes.

Rocklee6544

Pelo que eu saiba as classes wrappers fazem o desenpacotamento e o empacotamente de forma automática.
OU seja de forma implícita.
Afinal se fosse ao contrário nós teriamos digitar que new Integer(15);

jairodione

para funcionar corretamente basta fazer isto:

public class Teste09 { public static void main(String args[]){ boolean b; Integer l = 65, i = 65; if(l == i){ b = true; }else{ b = false; } System.out.println(b); } }

gabrielmassote

Algumas comparações interessantes também.
Se algum comentário estiver errado, corrijam.

Integer i = 65;
		Integer i2 = 65;
		
		System.out.println("Caso 1:");
		System.out.println(i == i2); // creio que utiliza-se a mesma referencia. Ao estilo do pool de string. Posso estar errado, não me recordo.
		System.out.println(i.equals(i2)); // compara-se os valores atribuidos, nao a referencia
		System.out.println(i == 65); // faz o unboxing do i para comparar ao primitivo 65. Retornando true
		System.out.println(i == new Integer(65)); // compara-se referencias
		
		i = new Integer(65);
		i2 = new Integer(65);
		
		System.out.println("Caso 2:");
		System.out.println(i == i2); // sao dois objetos, com isso verifica se possuem a mesma referencia.
		System.out.println(i.equals(i2)); // compara-se os valores atribuidos, nao a referencia
		System.out.println(i == 65); // faz o unboxing do i para comparar ao primitivo 65. Retornando true
		System.out.println(i == new Integer(65)); // compara-se referencias
Criado 6 de setembro de 2003
Ultima resposta 1 de mai. de 2011
Respostas 23
Participantes 12