Problemas com Casting!

Eu não entendi muito bem o uso do casting nesse codigo. No if ele verifica se o objeto o é do tipo Fruta e se for verdade ele armazena o objeto o no objeto f que tambem é uma fruta. Mas se ja foi verificado que o é uma fruta então para que ao atribui-lo a f fazer o casting? ( Já que os dois dão fruta então não pelo meu ver não há a necessidade de forçar o a tornar-se uma fruta!!!)

Quem poder me ajudar agradeço!

for (Iteraror it = frutas.iterator(); it.hasNext();) { Object o = it.next(); if (o instanceof Fruta) { Fruta f = (Fruta)o; System.out.println ("Árvore de " + f + " é " + f.getTree()); } }

O casting nunca transforma nada.
Se o objeto o não fosse uma fruta e você fizesse (Fruta) o seria lançada uma exceção dizendo que a variável o não é do tipo Fruta.
A utilidade do casting é você explicitar que o objeto é de um tipo mais específico do que o declarado.
Você só pode invocar na variável o os métodos da classe Object, porque o compilador sabe que o é um Object.
Quando você faz um casting pra Fruta e guarda isso na variável f do tipo Fruta o compilador passar a saber que o objeto é do tipo Fruta e você então pode invocar os métodos da classe Fruta.

É isso aí ± :stuck_out_tongue:

ps: observe que o e f referenciam o mesmo objeto…

[quote=jukkinha]O casting nunca transforma nada.
Se o objeto o não fosse uma fruta e você fizesse (Fruta) o seria lançada uma exceção dizendo que a variável o não é do tipo Fruta.
A utilidade do casting é você explicitar que o objeto é de um tipo mais específico do que o declarado.
Você só pode invocar na variável o os métodos da classe Object, porque o compilador sabe que o é um Object.
Quando você faz um casting pra Fruta e guarda isso na variável f do tipo Fruta o compilador passar a saber que o objeto é do tipo Fruta e você então pode invocar os métodos da classe Fruta.

É isso aí ± :stuck_out_tongue:

ps: observe que o e f referenciam o mesmo objeto… [/quote]

td bem, eu entendo o que vc disse mas nesse caso não há a necessidade de se fazer Fruta f = (Fruta)o; usando casting já que isso só será executado se for verdade:
if (o instanceof Fruta) ?

Então poderia ser assim:

if (o instanceof Fruta) {  
          Fruta f = o;  //SEM CASTING!!!
          System.out.println ("Árvore de " + f + " é " +  
          f.getTree());  
    }  

???

vlw

Você é obrigado a efetuar o casting nesse caso:

      Object o = ...;
      if (o instanceof Fruta) {  
           Fruta f = o; // erro de compilação 

Isso porque o compilador não faz a inferência de que nesse caso “o” é uma Fruta; já que você poderia pôr uma expressão arbitrariamente complicada no if. Isso só é possível em linguagens que são tipadas dinamicamente, como o Python ou o Ruby, já que isso é determinado em tempo de execução e não de compilação como no Java.

Para o Java, tanto faz se você fizer isto também:

      Object o = ...;
      if (! (o instanceof Fruta)) {  
           Fruta f = o; 

que está errado do mesmo jeito.