Interface List<> [resolvido]

12 respostas
FernandoKozlov

Galera minha duvida é mais teorica do tecnica, então:

Eu tenho um método que lê um xml e retorna um List de Negocio:

public List<Negocio> carrega(Reader fonte) {
		XStream stream = new XStream(new DomDriver());
		stream.alias("negocio", Negocio.class);
		return (List<Negocio>) stream.fromXML(fonte);
	}

E tenho um método que é responsável por abrir um arquivo e passá-lo como parâmetro no método acima:

public void escolher() {
		try {
			JFileChooser fileChooser = new JFileChooser();
			int retorno = fileChooser.showOpenDialog(null);
			
			if(retorno == JFileChooser.APPROVE_OPTION){
				FileReader reader = new FileReader(fileChooser.getSelectedFile());
				List<Negocio> negocios = new LeitorXML().carrega(reader);
			}
		}
}
A duvida é a seguinte: O certo não seria o método
carrega()
retornar um ArrayList ou alguma classe que implemente a interface List?

Dessa maneira que aí a List vai receber outra List (Uma interface recebendo ela mesmo??!)

Alguém pode me ajudar com isso? O programa funciona dessa maneira, mas para mim não faz muito sentido em relação a parte teorica msm... Fonte: Apostila Caelum.

Meu Primerio post aqui no GUJ. Se eu fiz alguma besteira desde já peço perdão! :P

12 Respostas

cido18

Olá FernandoKozlov,

Estou fazendo esta apostila também, se não me engano por baixo dos panos o stream.fromXML retorna um array qualquer. Mas pensando no polimorfismo, qual seria a classe geral para qualquer Array?? O List está no topo da hierarquia , ou seja , o stream.fromXML pode retornar qualquer tipo de array que vai acabar funcionando.

Espero que ajude.

FernandoKozlov

cido18:
Olá FernandoKozlov,

Estou fazendo esta apostila também, se não me engano por baixo dos panos o stream.fromXML retorna um array qualquer. Mas pensando no polimorfismo, qual seria a classe geral para qualquer Array?? O List está no topo da hierarquia , ou seja , o stream.fromXML pode retornar qualquer tipo de array que vai acabar funcionando.

Espero que ajude.

Olá!

Na verdade o método fromXML retorna um objeto do tipo object aí eu converto esse objeto em um objeto do tipo List usando cast. Olha: return (List<Negocio>) stream.fromXML(fonte);

Então o método escolhe recebe um List, assim: List<Negocio> negocios = new LeitorXML().carrega(reader);

Seria o mesmo que dizer: List<Negocio> negocios = new List<Negocio>;

A questão é justamente essa: O que acontece por debaixo dos panos que uma List recebe outra List? Será que acontece alguma conversão implicita?

Obrigado por participar cido18

:wink:

Rodrigo_Sasaki

Não… a ideia é programar para interfaces, para facilitar a manutenção. Veja o seguinte post, e leia com atenção os códigos, porque vão matar a sua dúvida.

Pode ter certeza que em algum lugar na implementação, existe um new ArrayList, ou new LinkedList ou o que for.

FernandoKozlov

digaoneves:
Não… a ideia é programar para interfaces, para facilitar a manutenção. Veja o seguinte post, e leia com atenção os códigos, porque vão matar a sua dúvida.

Pode ter certeza que em algum lugar na implementação, existe um new ArrayList, ou new LinkedList ou o que for.

Olá digaoneves! Obrigado por ajudar… :smiley:

Esses conceitos de polimorfismo eu já conheço… Mas a minha duvida aqui é diferente e tá basicamente no seguinte trecho:

Na implementação o método carrega retorna um List. Ou seja eu declarei uma referencia negocios do tipo List e inicilizei ela com um tipo List tbm… Não faz muito sentido eu declarar uma Interface e incializar uma Interface… Acho que deve ocorrer alguma conversão implicita, vou acreditar que seja isso… por enquanto.

Rodrigo_Sasaki

Cara, dentro do método, pode ter certeza que ele instancia um tipo concreto, um ArrayList, LinkedList, não sei. Veja o seguinte códigopublic List<String> getList(){ return new ArrayList<String>(); }Qual o tipo sendo retornado?

Se ainda tiver dúvidas, após a linha que invoca o método carrega, coloque isso e veja o que é impresso: System.out.println(negocios.getClass());

FernandoKozlov
digaoneves:
Cara, dentro do método, pode ter certeza que ele instancia um tipo concreto, um ArrayList, LinkedList, não sei. Veja o seguinte código
public List<String> getList(){
    return new ArrayList<String>();
}
Qual o tipo sendo retornado? Se ainda tiver dúvidas, após a linha que invoca o método carrega, coloque isso e veja o que é impresso:
System.out.println(negocios.getClass());

Cara, vc leu direito o post principal?

Olha:

public List<Negocio> carrega(Reader fonte) {
		XStream stream = new XStream(new DomDriver());
		stream.alias("negocio", Negocio.class);
		[b]return (List<Negocio>) stream.fromXML(fonte);[/b]
	}

O que vc acha que ele retorna ai? :?

Agora olha a método que consome isso:
public void escolher() {
		try {
			JFileChooser fileChooser = new JFileChooser();
			int retorno = fileChooser.showOpenDialog(null);
			
			if(retorno == JFileChooser.APPROVE_OPTION){
				FileReader reader = new FileReader(fileChooser.getSelectedFile());
				List<Negocio> negocios = new LeitorXML().carrega(reader);
				
				[b]System.out.println(negocios.getClass());[/b]    // --  o esquema que vc falou
				
				Negocio primeiroNegocio = negocios.get(0);
				String msg = "Primeiro negócio do dia: " + primeiroNegocio.getPreco();
				JOptionPane.showMessageDialog(null, msg);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

Fiz o esquema do syso e olha o que mostrou na tela: class java.util.ArrayList

Realmente é um ArrayList... mas vc percebeu que essa "conversão" não tá implementada? Isso acontece na JVM? :-o

FernandoKozlov
digaoneves:
Cara, dentro do método, pode ter certeza que ele instancia um tipo concreto, um ArrayList, LinkedList, não sei. Veja o seguinte código
public List<String> getList(){
    return new ArrayList<String>();
}
Qual o tipo sendo retornado? Se ainda tiver dúvidas, após a linha que invoca o método carrega, coloque isso e veja o que é impresso:
System.out.println(negocios.getClass());

Cara, vc leu direito o post principal?

Olha:

public List<Negocio> carrega(Reader fonte) {
		XStream stream = new XStream(new DomDriver());
		stream.alias("negocio", Negocio.class);
		[b]return (List<Negocio>) stream.fromXML(fonte);[/b]
	}

O que vc acha que ele retorna ai? :?

Agora olha a método que consome isso:
public void escolher() {
		try {
			JFileChooser fileChooser = new JFileChooser();
			int retorno = fileChooser.showOpenDialog(null);
			
			if(retorno == JFileChooser.APPROVE_OPTION){
				FileReader reader = new FileReader(fileChooser.getSelectedFile());
				List<Negocio> negocios = new LeitorXML().carrega(reader);
				
				[b]System.out.println(negocios.getClass());[/b]    // --  o esquema que vc falou
				
				Negocio primeiroNegocio = negocios.get(0);
				String msg = "Primeiro negócio do dia: " + primeiroNegocio.getPreco();
				JOptionPane.showMessageDialog(null, msg);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

Fiz o esquema do syso e olha o que mostrou na tela: class java.util.ArrayList

Realmente é um ArrayList... mas vc percebeu que essa "conversão" não tá implementada? Isso acontece na JVM? :-o

Rodrigo_Sasaki

Claro que está implementada, só não está em um lugar que você consiga acessar. A lista é instanciada nessa linha:return (List<Negocio>) stream.fromXML(fonte);O método fromXML que instancia o ArrayList, se você conseguisse ver o código dentro dele veria em algum lugar ali que existe um new ArrayList

cido18

FernandoKozlov, para saber o que exatamente está sendo implementado, você vai precisar abrir o código do stream.fromXML, mas o certo é que provavelmente deva ser algumas das classes abaixo do List.

FernandoKozlov

Object com.thoughtworks.xstream.XStream.fromXML(Reader reader)

Note: This element neither has attached source nor attached Javadoc and hence no Javadoc could be found

Ele retorna um Object… e eu converso isso em um List

return (List<Negocio>) stream.fromXML(fonte);

Pq o método diz que retorna um Object? :?

cido18

FernandoKozlov,

Eu dei um olhada, pelo que entendi ele retorna vários objetos(levando em consideração o arquivo xml), e monta uma lista a partir do xml.

FernandoKozlov

cido18:
FernandoKozlov,

Eu dei um olhada, pelo que entendi ele retorna vários objetos(levando em consideração o arquivo xml), e monta uma lista a partir do xml.

Teria que ser então um Object[]. Não concorda?

Criado 28 de setembro de 2012
Ultima resposta 28 de set. de 2012
Respostas 12
Participantes 3