dúvidas em casting em coleções / Collection

Oi pessoal, estava lendo sobre Coleções e fazendo um teste, vi uma limitação, seguinte:

Collection lista = new ArrayList; // ArrayList herda de List que herda de Collection
quando uso a referência de objeto “c”, não aparecem os métodos de ArrayList,
mas se eu fizer:
List lista = new ArrayList(); // assim aparece todos os métodos de ArrayList

Alguém sabe porque meu Eclipse dá erro?(poque não posso generalizar minhas coleções sempre em Collection?)

Na verdade o que ocorre é que quando voce faz algo do tipo, voce irá necessitar de 2 imports:

  • da interface
  • da implementação, no caso ArrayList
List lista = new ArrayList()

O seu problema é que quando voce esta digitando o Eclipse não fez ainda os imports dessas classes/interface logo não irá habilitar o autocomplete:

Experimente fazer isso:

List lista

Aperte: Ctrl + Shift + O = atalho do eclipse para organizar os imports (Escolha a interface java.util.collections)

lista = new ArrayList()

mesmo assim… se ele fizer

List lista = new ArrayList();

ele ainda preciza passar o tipo da List nao??

[code]import java.util.ArrayList;
import java.util.List;

public class ListTestDrive {
public static void main(String[] args) {
List myList = new ArrayList();
}

}[/code]

se ele fizer só o List myLsit = new ArrayList();
nem funciona

Ao fazeres Collection c = new ArrayList() estás a dizer que c é uma Collection e que a implementação que vais usar é a de ArrayyList.
O objectivo desta abordagem é que, se tiveres de alterar de ArrayList para outra qualquer implementação não precisas de alterar a assinatura dos teus métodos que continuam a trabalhar com Collections. A desvantagem é que não tens disponíveis os métodos das implementações. Podes sempre usar o iterator para aceder aos elementos da Collection.

E, para o maxmustang, List lista = new ArrayList(); funciona sem qualquer problema. Antes do java 5 era mesmo a única maneira de fazer, antes de haver generics.

MaxMustang,

Acho que voce está equivocado, no seguinte aspecto e acredito que o motivo disso é que acho que voce começou a estudar Java depois da versão 5.0, onde foi lançando suporte a "Generics".

Vamos ao questionamento:

[quote=maxmustang]mesmo assim… se ele fizer

List lista = new ArrayList();

ele ainda preciza passar o tipo da List nao??

Errado…O "tipo" da lista que acredito que voce esteja falando, seja exatamente a questão do Generics, nada impede que eu crie uma Collection "não tipada", porém irei perder as features que a interface me asseguraria (geralmente no caso de um ArrayList, a utilização de for each sem o cast).

[code]import java.util.ArrayList;
import java.util.List;

public class ListTestDrive {
public static void main(String[] args) {
List myList = new ArrayList();
}

}[/code]

se ele fizer só o List myLsit = new ArrayList();
nem funciona [/quote]

Claro que funciona… pode testar, a única coisa que irá acontecer de "anormal", seria o raise de um warning informando que o tipo List<> não é genérico, mas funcionar funciona SIM (vide Spring, EJB, etc.).

Vamos pensar assim, Spring…basicamente como ele funciona:

  • Voce cria uma interface que define métodos;
  • implementa em "x" classes diferentes (se voce for implementar em apenas uma classe a interface perde o sentido com relação ao reuso - não vou entrar agora em detalhes de baixo e alto aclopamentos);
  • através de arquivos de configuração, voce fala pro Spring : "Spring meu camarada, quando a classe X for instanciada, injeta a classe Y" . Porém quando voce olha o código dessa classe Y, ela tem UMA INTERFACE.

Mas ué…INTERFACE nao é objeto, como ela executa os métodos ?

Quando voce trabalha com alguma framework de DI, o mecanismo basicamente funciona da mesma forma.

1 - Cria uma interface;
2 - implementa ela em any classes;
3 - Especifica qual classe (implementação) deverá ser injetada pelo container em determinadas classes;
4- quando a determinada classe é instanciada, a mesma recebe a injeção de dependência da IMPLEMENTAÇÃO da interface, e então, voce poderá usufruir da mesma, mas o segredo esta na interface;

Dica: 8)

  • É sempre bom utilizar o tipo mais Genérico (facilita alterações);
  • Programe sempre pensando em interfaces;
  • não sei se os exemplo foram claros, me desculpe mas não consigo pensar em algo melhor do que o Spring;

hum
realmente
nao sabia disso
vlw pela dica

nao existe generics em tempo de execução :wink:

o compilador avisa que vc pode acabar fazendo alguma merda se nao usar generics, mas compila sem problemas :wink:

a sun não quis ferrar a vida de todo mundo que já havia utilizado algo da Collection pré java 5…

vinicius.martinez
fiz import de tudo , quando necessário

pmlm
se uso a interface Collection não tenho acesso a gets e sets das classes, mas tenho o método interator() e add(), devo descer uma hierarquia e não usar a interface Collection e usar as List e Set?

vinicius.martinez
- É sempre bom utilizar o tipo mais Genérico (facilita alterações);
no meu caso usar a interface mãe(Collection) não dá muito certo pq perco alguns métodos

Só tu poderás saber e analisar se para o que pretendes não iras ter depois problemas no futuro ao descer um nível na hierarquia. Se preferes perder alguma facilidade de alterações no futuro para facilitar agora o desenvolvimento é uma decisão tua. Depois terás de viver com as consequências :slight_smile:

vlw pessoal, o negócio é dar preferência às interfaces List e Set para implemetar coleções,
obrigado.

[quote=daquinho]vlw pessoal, o negócio é dar preferência às interfaces List e Set para implemetar coleções,
obrigado.[/quote]

O negócio mesmo é planejar sua aplicação de acordo com suas necessidades atuais e expectativa de crescimento… não tem essa de “isso ou aquilo é melhor”… voce só tem que saber o que cada coisa faz, pra que serve, e quando usar… se voce não precisa dos métodos especificos da implementação da lista, use Collection que é o mais geral… se precisar obrigatóriamente dos métodos específicos, desça um nível e escolha se quer um List, um Set, um Map… e assim por diante…

[quote=marcelo.bellissimo][quote=daquinho]vlw pessoal, o negócio é dar preferência às interfaces List e Set para implemetar coleções,
obrigado.[/quote]

O negócio mesmo é planejar sua aplicação de acordo com suas necessidades atuais e expectativa de crescimento… não tem essa de “isso ou aquilo é melhor”… voce só tem que saber o que cada coisa faz, pra que serve, e quando usar… se voce não precisa dos métodos especificos da implementação da lista, use Collection que é o mais geral… se precisar obrigatóriamente dos métodos específicos, desça um nível e escolha se quer um List, um Set, um Map… e assim por diante…[/quote]
… isso ai …

[quote=marcelo.bellissimo][quote=daquinho]vlw pessoal, o negócio é dar preferência às interfaces List e Set para implemetar coleções,
obrigado.[/quote]

O negócio mesmo é planejar sua aplicação de acordo com suas necessidades atuais e expectativa de crescimento… não tem essa de “isso ou aquilo é melhor”… voce só tem que saber o que cada coisa faz, pra que serve, e quando usar… se voce não precisa dos métodos especificos da implementação da lista, use Collection que é o mais geral… se precisar obrigatóriamente dos métodos específicos, desça um nível e escolha se quer um List, um Set, um Map… e assim por diante…[/quote]
Referência bem legal sobre a API de Collections: http://sergiotaborda.wordpress.com/desenvolvimento-de-software/java/colecoes-em-java/