Duvida sobre ArrayList

Boa tarde
Estou começando a programar em java e me surgiu uma duvida quanto ArrayLists.
E possivel armazenar um objeto em um ArrayList?

Estou tentando fazer a seguinte coisa.
Estou criando um cadastro de NF.
Criei um objeto NF e um outro objeto ItemNf.
O objeto NF possui um arraylist em que eu quero armazenar os itens de NF

a duvida e a seguinte, como eu faço para utilizar um metodo do itemNF a partir do arraylist?

eu criei um metodo na NF para me listar os produtos dos itens da NF.
O metodo getProduto e do objeto ItemNf.
Como eu faço para chama-lo?
Segue como eu coloquei mas que deu errado. acho q deve haver outra forma para chamar este metodo mas eu nao sei qual e. Alguem poderia me ajudar?

public void listaItemNf(){
	for (int i = 0;i < item.size(); i++){
		System.out.println("teste " + i + ": " + item.get(i).getProduto);
	}
}	

Obrigado

Se vc usa ArrayList simples, ele contém objetos da classe Object ( ou seja, quaisquer)
mas isso implica que ao fazer get(i) ele retorna um Object que não tem o método getProduto()

Então existem duas soluções. No java 5.0 e seguints vc usa generics. Defina o array assim ArrayList
Isto significa “é um arrayList de ItemNF” , ai o codigo vai funcionar.
Em qq versão do java vc deve fazer cast

public void listaItemNf(){ for (int i = 0;i < item.size(); i++){ System.out.println("teste " + i + ": " + ((ItemNF)item.get(i)).getProduto); } }

Que é meio chato. Por favor use java 6 se quer ter um codigo limpo :wink:

Sergio

Era isso mesmo. Muito obrigado pela atenção.

se vc usar o recurso de genericos nao precisa fazer o cast.

ArrayList <Integer>lista= new ArrayList<Integer>();

recurso java 1.5…

[quote=LPJava]se vc usar o recurso de genericos nao precisa fazer o cast.

ArrayList <Integer>lista= new ArrayList<Integer>();

recurso java 1.5…[/quote]

Lembrando que ArrayList é uma classe que implementa a interface List. Existem outras classes que também implementam esta interface e que podem substituir o ArrayList com funcionalidades similares.
É mais interessante declarar a variável como interface e não como a classe concreta, o que torna o código mais flexível.

Considere o exemplo besta abaixo, onde o método recebe uma lista de Strings e retorna uma String com tudo concatenado

public String listToString(List<String> lista) {
   StringBuffer sb = new StringBuffer();
   for(String s : lista) {
      sb.append(s);
   }
   return sb.toString();
}

O método acima pode receber um ArrayList, um Vector ou um LinkedList, sem a necessidade de alteração do código.

Programe sempre voltado para interfaces e não para classes concretas :wink:

poo otima dica… é o que eu vinha tentando descobrir pq as vezes usar o List por exemplo ou o ArrayList… valeu pela dica… boa… mesmo :D!!!

  1. Bom então deveria ser:
public String listToString(List<String> lista) {
   Appendable sb = new StringBuffer();
   for(String s : lista) {
      sb.append(s);
   }
   return sb.toString();
}

:wink:

[quote=sergiotaborda][quote=cassio]
É mais interessante declarar a variável como interface e não como a classe concreta, o que torna o código mais flexível.

Considere o exemplo besta abaixo, onde o método recebe uma lista de Strings e retorna uma String com tudo concatenado

public String listToString(List<String> lista) {
   StringBuffer sb = new StringBuffer();
   for(String s : lista) {
      sb.append(s);
   }
   return sb.toString();
}

[/quote]

  1. Bom então deveria ser:
public String listToString(List<String> lista) {
   Appendable sb = new StringBuffer();
   for(String s : lista) {
      sb.append(s);
   }
   return sb.toString();
}

;)[/quote]

Poderia, mas nesse caso não faz a menor diferença, já que sua declaração começou e morreu dentro do próprio método. No exemplo que eu dei, o uso de interfaces tornou o método suficientemente flexível para receber qualquer objeto que seja instância de uma classe que implemente a interface List. No seu exemplo, o Appendable é um StringBuffer e pronto :slight_smile:

[quote=cassio][quote=sergiotaborda]

public String listToString(List<String> lista) {
   Appendable sb = new StringBuffer();
   for(String s : lista) {
      sb.append(s);
   }
   return sb.toString();
}

;)[/quote]

Poderia, mas nesse caso não faz a menor diferença, já que sua declaração começou e morreu dentro do próprio método. (…) No seu exemplo, o Appendable é um StringBuffer e pronto :-)[/quote]

:wink: Apenas levando o conceito de “programe para interfaces” às suas ultimas conseqüências. :roll:

E faz diferença sim, porque meu Appendable é agora um StringBuilder :wink:

public String listToString(List<String> lista) {
   Appendable sb = new StringBuilder();
   for(String s : lista) {
      sb.append(s);
   }
   return sb.toString();
}

Mesmo quando o objeto é usando apenas dentro de um método é interessante usar interfaces em vez de classes, isto porque um dia no futuro vc pode querer mudar a classe real que é usada. Os motivos são vários , mas o principal deles é que vc pode querer usar uma implementação mais recente da interface que tem maior eficiência.
Como vc mesmo disse " É mais interessante declarar a variável como interface e não como a classe concreta, o que torna o código mais flexível. " 8)