Existe "objeto" genérico?

4 respostas
I

Estou implementando para faculdade uma
Estrutura de Dados, que é uma LISTA.

O problema é o seguinte… esse lista deve funcionar para
várias classes, sem alteração em seu código.

Ex:
Hoje vou utilizar essa lista pra cadastrar um Aluno.
Então o método seria:

public void insereNoFinal (Aluno umAluno) {
}

Porém, amanhã eu posso querer utilizar essa classe lista para
implementar um cadastro de Professores.

public void insereNoFinal (Professor umProfessor) {
}

Então a minha dúvida é a seguinte:
Existe algo do tipo:

public void insereNoFinal (Object umObjeto) {
}

Que toda vez que eu enviar um objeto qualquer para o método,
ele consiga ver de qual classe é esse objeto e fazer a inserção?

4 Respostas

C

Cara…em tempo de execuçao vc pode usar o metoo getClass() do objeto Object…ele te retorna um objeto Class, indicando qual a classe do objeto…mas pra q vc ker saber o tipo da classe se vc vai poder inserir de qualker jeito???

Vlw!!

J

Esse "inserir" que você fala, é quardar na lista? Se for, é exatamente assim que funcionam as listas do Java, elas recebem um Object, e internamente tem um array de Object.

ex.:

public class Lista{
   private Object[] objetos;

   public void inserir(Object obj){
      //coloca no array
   }
}

Existe um recurso chamado generics tambem que pode deixar isso um pouco mais sofisticado, mas acho que não é o que você quer agora!

I

Essa “lista” é um TAD (Tipo Abstrato de Dados).
E ela pode ser implementada em qualquer linguagem.
Ela é baseada em “chave única”, ou seja, cada elemento
terá um número que o identificará.
Ela só usa alocação de memória dinâmica.
Não usa mais nenhuma classe java.

Eu não coloco o código fonte aqui pois ele é muito grande.

Os métodos são:

inserirFinalDaLista(Obj)
inserirInicioDaLista(Obj)
inserirEmDeterminadaPosicao(Obj, Posicao)
inserirAntesDoElementoTal(Obj, Obj)
inserirDepoisDoElementoTal(Obj,Obj)
inserirOrdenado(Obj)

excluirPrimeiro
excluirUltimo
excluirElementoTal
excluirDaPosicaoTal

cursorVaParaPrimeiro
cursorVaParaUltimo
cursorAvancar
cursorRetroceder

buscaElementoComListaOrdenada(chave)
buscaElementoNaoOrdenado(chave)
buscaPosicaoDeUmElemento(chave)

Resumindo:

public class ListaEncadeada {

}

(é a classe que eu descrevi acima.)

Essa classe deve servir pra fazer diversos tipos de listas.
Sem que seu código fonte seja editado.

Se eu quizer criar uma lista de aluno, eu consigo.
Se eu quizer criar uma lista de professores, eu consigo.
Somente criando outras classes e fazendo uso dessa classe ListaEncadeada.
Ex: class Aluno / class Professores / etc…

A classe ListaEncadeada possue métodos que necessitam acessar
métodos de outras classes.
Então através do conceito de “interface java” eu consigo fazer com
que estes métodos estejam presentes.
Que métodos são esses?

  • setChaveUnica
  • getChaveUnica

Então agora que vamos a minha dúvida!

Eu possuo uma classe aluno, esta classe efetuada o cadastro do aluno,
digamos que ela faz o seguinte:

nome   idade  chave

Aluno umAluno = new Aluno (Rodrigo, 18 , 12345)

Então na classe ListaEncadeada


public void insereNoFinal (Aluno umAluno) {
}

Ou seja ela recebe o obj umAluno coloca ele na lista.

Porém, se eu decidir criar uma lista de professores?

nome idade chave

Professor umProfessor = new Professor (Rafael, 55 , 13543)


public void insereNoFinal (Professor umProfessor) {
}

Ou seja, eu tenho que dar um jeito para que indepentende do
tipo de objeto que a lista receba, ele insira o elemento na lista.

Algo genérico deste tipo:


public void insereNoFinal (Object objQualquer) {
}

Se uma classe der:

Professor umProfessor = new Professor (Rafael, 55 , 13543)
Ele vai interpretar o Object objQualquer como Professor umProfessor,
e vai adicionar na lista.

Aluno umAluno = new Aluno (Rodrigo, 18 , 12345)
Ele vai interpretar o Object objQualquer como Aluno umAluno,
e vai adicionar na lista.

E nessa classe ListaEncadeada eu também tenho que poder dar:

objQualquer.getChave() seja igual à umAluno.getChave();

ou

objQualquer.getChave() seja igual à umProfessor.getChave();

Acho que não tenho como ser mais detalhista do que isto.
Se alguém tiver alguma dúvida só perguntar.

FieroddPJ

Use a dica do jairelton … ai implemente seu codigo pra receber qualquer objeto
entao quando vc precisa retira-lo da lista e utilizado basta fazer o cast

public void insereNoInicio(Object obj){
   //salva o objeto recebido
}


Aluno aluno = (Aluno)lista.getObjeto[0];
ou
Professor prof = (Professor)lista.getObjeto[0]

no java qualquer classe concreta deriva de Object, portanto se sua lista armazana tipos object, ela pode armazenar qualquer tipo, contanto vc faça a conversão qdo necessario

Criado 8 de julho de 2006
Ultima resposta 9 de jul. de 2006
Respostas 4
Participantes 4