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!
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.
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?
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…
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.