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.
[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í ±
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());
}
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;