Pessoal TO PRECISANDO usar isto e não consigo… Leia o trecho abaixo e respondam qual é a saida, sem compila-la, então compilem e me digam pq sai isto, msm q não saibam o pq respondam qual foi a saida q imaginaram quando leram – pergunta da sun…
public class Cast {
public static void main(String[] args) {
A var = new A();
var.incrementa();
A1 var1 = (A1)var;
var1.incrementaB();
System.out.println(var.x);//editado
}
}
class A{
int x;
A(){
x = 0;
}
void incrementa (){
x++;
}
}
class A1 extends A{
void incrementaB(){
x+=5;
}
}
Olá flasoft!
Dá erro pelo seguinte: A instância referênciada pela variável var é do tipo A, e não tem como vc converter de A para A1.
Isto só daria certo se a instância armazenada por var fosse uma instância de A1, ou de alguma classe filha, neta, etc de A1:
public static void main(String[] args) {
A var = new A1();
var.incrementa();
A1 var1 = (A1)var;
var1.incrementaB();
System.out.println(var.x);//editado
}
Por que isto acontece? Porque não tem como vc utilizar uma referência de uma classe filha(A1 var1) para referenciar um objeto de uma classe pai(new A()). Perceba que isto é meio lógico, pois se var1 é do tipo A1, vc poderia fazer…
var1.incrementaB();
…Só que var1 estaria “apontando” para uma instância do tipo A, que não tem definido o método incrementaB(). Por isso que o compilador não permite que seja feito tal tipo de cast, e lança um ClassCastException
Qq dúsvida, pergunte mais, ok!
[quote=Mantu]Olá flasoft!
Dá erro pelo seguinte: A instância referênciada pela variável var é do tipo A, e não tem como vc converter de A para A1.
Isto só daria certo se a instância armazenada por var fosse uma instância de A1, ou de alguma classe filha, neta, etc de A1:
public static void main(String[] args) {
A var = new A1();
var.incrementa();
A1 var1 = (A1)var;
var1.incrementaB();
System.out.println(var.x);//editado
}
Por que isto acontece? Porque não tem como vc utilizar uma referência de uma classe filha(A1 var1) para referenciar um objeto de uma classe pai(new A()). Perceba que isto é meio lógico, pois se var1 é do tipo A1, vc poderia fazer…
var1.incrementaB();
…Só que var1 estaria “apontando” para uma instância do tipo A, que não tem definido o método incrementaB(). Por isso que o compilador não permite que seja feito tal tipo de cast, e lança um ClassCastException
Qq dúsvida, pergunte mais, ok![/quote]
Pois é, eu falei isso ali em cima, mas o Flasoft falou sobre
Graphics2D extends Graphics
//e vc pode fazer o cast
public void paint (Graphics g){
Graphics2D g2 = (Graphics2d)g;
}
[quote=Flasoft]é eu dei uma pesquisada e isso realmente acontece…
e por isto, por certo no metodo
public void paint(Graphics g){
Graphics2D g2 = (Graphics2D)g;
}
obj passado por parametro é do tipo Graphics2D…
ex:
Graphics2D gra2 = null;
this.paint(gra2);
Então a unica coisa q fazemos em um Cast é faze-lo voltar em a sua forma anterior(filha)?[/quote]
No caso que você mostrou:
Graphics2D g2 = (Graphics2D)g;
O casting é valido pois o parametro do metodo recebe um Graphics g, mas lembresse que é uma variável do tipo Graphics que não tem uma referência a Graphics, portanto o casting é valido!!a variável g PODE ter uma referência a Graphics2D, no caso de não ter uma ClassCastException será lançada em tempo de execução…