Generics Tiger

7 respostas
1112

Prefira outras Collections a Vector, como ArrayList.

Você pode fazer o seguinte:

ArrayList<Pessoa> pessoas = new ArrayList<Pessoa>(); // ... for( Pessoa p : pessoas ) { if( !(p instanceof PessoaJuridica ) ) continue; PessoaJuridica pj = (PessoaJuridica)p; }

7 Respostas

urubatan

Toniolo:
#@®®¡$:
Prefira outras Collections a Vector, como ArrayList.

Você pode fazer o seguinte:

ArrayList<Pessoa> pessoas = new ArrayList<Pessoa>(); // ... for( Pessoa p : pessoas ) { if( !(p instanceof PessoaJuridica ) ) continue; PessoaJuridica pj = (PessoaJuridica)p; }

Certo, concordo isso resolve o problema, porém vamos pensar que se utilizamos generic é pelo fato de não haver a necessidade de realizarmos um casting quando formos recuperar o objeto. Isso que esta pegando, gostaria de ver se existe uma maneira de recuperar os objs sem fazer casting ???

Obrigado


tu não pode pegar direto pessoa fisica de um lugar onde pode ter pessoa fisica e pessoa juridica.
isto iria causar um class cast exception.

se tu quer trabalhar direto com pessoa juridica tem que fazer:

ArrayList<PessoaJuridica> pessoas = new ArrayList<PessoaJuridica>(); // ... for( PessoaJuridica p : pessoas ) { //... }

1112

Exemplo prático: você tem um cesto de frutas. Lá você coloca maçãs e pêras. Você sabe que, se tirar algo do cesto, será uma fruta, mas até pegar e olhar, não saberá se é uma pêra ou uma maçã. Daí, depois de pegar a fruta e conferir que é uma maçã, para usar propriedades exclusivas da maçã (como fazer torta de maçã), você precisa garantir que seja uma maçã. Daí a coisa fica assim:

public TortaDeMaca fazTortadeMaca( Maca m ){} //... ArrayList<Fruta> cesto = new ArrayList<Fruta>(); //... for( Fruta f : cesto ) { if( !(f instanceof Maca ) ) continue; // fazTortaMaca( f ); -- Não compila, pois o compilador sabe que // só pode aceitar maçãs no método e não sabe se f é uma maçã ou outra fruta fazTortaMaca( (Maca)f ); // Compila perfeitamente, pois você está // mostrando ao compilador que f é uma maçã }

Afinal, uma torta de maçã feita com limões não seria uma torta de maçã. :wink:

A

Galera o problema é o seguinte, Imaginem que eu tenha que colocar em um Vector um conjunto de pessoas que podem ser Pessoa, Jurídica e Física certo ?? ótimo, então fiz o seguinte:

import java.util.*;
import java.math.*;

class Pessoa 
{
	private String Nome;
	private int Idade;

	public void Put(String Nome,int Idade)
	               {this.Nome = Nome;
                                 this.Idade = Idade;}
}

class PessoaFisica extends Pessoa 
{
	private String CPF;

	public void Put(String Nome,int Idade,String CPF)
	              {	super.Put(Nome,Idade);
                                this.CPF = CPF;}
}
class PessoaJuridica extends Pessoa 
{
	private String CNPJ;

	 public void Put(String Nome,int Idade,String CNPJ)
	               {super.Put(Nome,Idade);
                                 this.CNPJ = CNPJ;}
}

Ok, até aqui tudo certo, porém quando vou cria um vetor que possa conter todas as pessoas Jurídicas e Físicas public Vector<? extends Pessoa> x = new Vector<? extends Pessoa>() sou premiado com um erro de compilação.
:shock: Agora se eu fizer algo assim: public Vector<Pessoa> x = new Vector<pessoa>() ótimo eu consigo colocar qualquer tipo de pessoa dentro do vetor, porém na hora de recuperar as pessoas Juridicas desse vetor fazendo for (PessoaJuridica p : x) erro na certa!! :shock:

Alguém por gentileza saberia me dizer uma forma de recuperar apenas um tipo de pessoa, dentro de um vetor que contenha todos os tipos de pessoa ? :smiley:

Grato, um forte abraço a comunidade Java!!

A

ok

A

#@®®¡$:
Prefira outras Collections a Vector, como ArrayList.

Você pode fazer o seguinte:

ArrayList<Pessoa> pessoas = new ArrayList<Pessoa>(); // ... for( Pessoa p : pessoas ) { if( !(p instanceof PessoaJuridica ) ) continue; PessoaJuridica pj = (PessoaJuridica)p; }

Certo, concordo isso resolve o problema, porém vamos pensar que se utilizamos generic é pelo fato de não haver a necessidade de realizarmos um casting quando formos recuperar o objeto. Isso que esta pegando, gostaria de ver se existe uma maneira de recuperar os objs sem fazer casting ???

Obrigado

A

urubatan:
Toniolo:
#@®®¡$:
Prefira outras Collections a Vector, como ArrayList.

Você pode fazer o seguinte:

ArrayList<Pessoa> pessoas = new ArrayList<Pessoa>(); // ... for( Pessoa p : pessoas ) { if( !(p instanceof PessoaJuridica ) ) continue; PessoaJuridica pj = (PessoaJuridica)p; }

Certo, concordo isso resolve o problema, porém vamos pensar que se utilizamos generic é pelo fato de não haver a necessidade de realizarmos um casting quando formos recuperar o objeto. Isso que esta pegando, gostaria de ver se existe uma maneira de recuperar os objs sem fazer casting ???

Obrigado


tu não pode pegar direto pessoa fisica de um lugar onde pode ter pessoa fisica e pessoa juridica.
isto iria causar um class cast exception.

se tu quer trabalhar direto com pessoa juridica tem que fazer:

ArrayList<PessoaJuridica> pessoas = new ArrayList<PessoaJuridica>(); // ... for( PessoaJuridica p : pessoas ) { //... }

Certo, agora estou tranquilo…então não dá pra ser feito!!!, estava imagina que podia existir algum mecanismo novo que permitisse isso…valeu mesmo…grande abraço!!!

A

#@®®¡$:
Exemplo prático: você tem um cesto de frutas. Lá você coloca maçãs e pêras. Você sabe que, se tirar algo do cesto, será uma fruta, mas até pegar e olhar, não saberá se é uma pêra ou uma maçã. Daí, depois de pegar a fruta e conferir que é uma maçã, para usar propriedades exclusivas da maçã (como fazer torta de maçã), você precisa garantir que seja uma maçã. Daí a coisa fica assim:

public TortaDeMaca fazTortadeMaca( Maca m ){} //... ArrayList<Fruta> cesto = new ArrayList<Fruta>(); //... for( Fruta f : cesto ) { if( !(f instanceof Maca ) ) continue; // fazTortaMaca( f ); -- Não compila, pois o compilador sabe que // só pode aceitar maçãs no método e não sabe se f é uma maçã ou outra fruta fazTortaMaca( (Maca)f ); // Compila perfeitamente, pois você está // mostrando ao compilador que f é uma maçã }

Afinal, uma torta de maçã feita com limões não seria uma torta de maçã. :wink:

Legal, bom exemplo, agora esta claro…sua resposta com as outras que aindei lendo, completam a idéia de que realmente não tem outra forma…Obrigado e um grande Abraço

Criado 4 de maio de 2006
Ultima resposta 5 de mai. de 2006
Respostas 7
Participantes 3