Interface List<> [resolvido]

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:

[code]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);
		}
	}

}[/code]

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! :stuck_out_tongue:

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.

[quote=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.[/quote]

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:

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.

[quote=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.

[/quote]

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.

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());

[quote=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ó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());[/quote]

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:

[code]
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();
	}
}[/code]

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

[quote=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ó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());[/quote]

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:

[code]
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();
	}
}[/code]

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

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

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.

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? :?

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.

[quote=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. [/quote]

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