[comp2-geral] Diferença entre Collection e C ollection

Fri, 30 Oct 2009 10:32:29 -0700

Foi perguntado na monitoria e a sutileza da diferença torna a pergunta
bastante interessante.

ArrayList<Pessoa> pessoas = new ArrayList<Pessoa>(); //declaração válida!
pessoas.add(new Pessoa()); //declaração válida!

ArrayList<Object> pessoasObject = pessoas; //Esta declaração é válida?

Em outras palavras,

"ArrayList<Object> é superclasse/supertipo de ArrayList<Pessoa>?"

A resposta é NÃO.


Vamos supor que este código fosse válido. Até agora temos:

ArrayList<Pessoa> pessoas = new ArrayList<Pessoa>();
pessoas.add(new Pessoa());

ArrayList<Object> pessoasObject = pessoas; //esta linha faz com que
"pessoasObject" referencie a mesma instância de ArrayList referenciada por
"pessoas", ou seja, uma instância de ArrayList<Pessoa>

Agora eu tento fazer:

pessoasObject.add(new Object());
ou
pessoasObject.add(new Carro());

Teoricamente pessoasObject poderia apontar para qualquer coisa, mas não pode
na prática. Não pode porque esta referência está apontando para uma
instância de ArrayList que SÓ ACEITA PESSOAS (vide primeira linha)!

Assim, não podemos adicionar Object ou Carro na instância sendo referenciada
por pessoasObject pois esta só aceita instâncias de Pessoa.


Esta sutileza faz com que precisemos declarar

ArrayList<?> ao invés de ArrayList<Object>.

Neste caso, não poderemos adicionar nada pela referência do tipo
ArrayList<?> já que não sabemos do que se trata mas podemos acessar os
métodos que não utilizam o tipo parametrizado como tipo para os parâmetros.

Assim, é diferente dizer que não se pode adicionar Object num ArrayList<?>
(que não sabemos do que é) de dizer que não se pode adicionar Object num
ArrayList<Object> (que claramente deveria ser possível).

Abraço

P.S.: Para mais informações sobre Generics:
http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

Peter P. Lupo
Undergraduating in Computer Science DCC/UFRJ
MPS.BR Authorized Implementation Practitioner
Sun Certified Java Associate
http://sites.google.com/site/pplupo
Cell. +55 (021) 81742487

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Comp 
2 - Geral" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/comp2-geral?hl=en
-~----------~----~----~----~------~----~------~--~---

Responder a