Estou tentando implementar o seguinte trecho de codigo:
public class Resultado(){
boolean status;
List<?> lista;
}
Na classe acima a lista estou tentando adicionar dois tipos de objetos:
public class Casa{
//campos casa
}
...
public class Apartamento{
//campos apartamento
}
Tento criar um handler para tratar essas listas
public class Handler{
private List<?> lista;
public void handle(int tipoImovel){
if(tipoImovel = 1){
lista = new ArrayList<Casa>();
Casa casa = new Casa();
lista.add(casa);
}
}
}
A linha lista.add(casa) nao compila, o que estou fazendo errado?
Acho que descobri o que eu estava errando, mas agora como faço para ler a lista?
public class Main {
public List<?> lista;
public void criarLista(){
List<Casa> listaCasa = new ArrayList<Casa>();
Casa casa = new Casa();
casa.setProprietario("Joao");
listaCasa.add(casa);
lista = listaCasa;
}
public void lerLista(){
//TODO: Não sei como fazer :(
}
}
Se alguém tiver alguma sugestão sobre os wildcards para melhorar esse exemplo eu agradeço.
@SuppressWarnings("unchecked")
public void engenhariaReversa(){
List<Casa> listaCasa = (List<Casa>) lista;
for(Casa casa : listaCasa){
System.out.println("Proprietário: " + casa.getProprietario());
}
}
Mas a última dúvida que tenho é se haveria uma maneira mais prática para descobrir o tipo da lista, por exemplo, digamos que eu tivesse que identificar se a lista é de casas ou de apartamentos, acredito que eu teria que fazer:
Ao que eu sei, essa linha nem compila: [quote]ArrayList<?> arrayList = (ArrayList<?>) lista; [/quote]
O seu ArrayList teria de definir um tipo, se quiser algo “generico”, use um Object.
Eu desconheço uma forma de testar se a sua lista é de um objeto tipo x ou tipo y, o que você poderia fazer é utilizar reflection para invocar o método desejado por você.
Eu já fiz isso, eu precisava realizar uma implementação indêntica mas com objetos distintos, o que eu fiz foi chamar via reflection o método que eu precisava.
Usando singleton e tals, mas enfim, dê uma pesquisa ou outra pessoa lhe indica um meio.
Abraços.
A aplicação irá receber um arquivo várias linhas durante o upload do arquivo o usuário indica qual é o tipo de arquivo (Casa ou Apartamento).
Depois que a aplicação recebe o arquivo ela deverá realizar o parse do arquivo de acordo com o seu template (basea-se no tipo de arquivo) e gera uma lista com os objetos Casa ou Apartamento.
Após realizar o parse e popular a lista a aplicação irá direcionar essa lista para que ela seja processada por outros serviços.
– Controler
Recebe arquivo
FileManager
Recebe o arquivo e o seu tipo -> Processa arquivo que pode retornar um List<Casa> ou um List<Apartamento> por isso pensei em fazer List<?>
O List<?> retorna para o controler, e o controler precisa obter o objeto especifico por exemplo Lista<Casa> para que essa lista seja processada no seu devido serviço.
Se alguém puder me ajudar até mesmo com outra solução eu agradeço.
Segue uma simulação do código completo, o código abaixo está funcionado.
O risco só vai ser confiar na linha List<Casa> listaCasa = (List<Casa>) lista, apesar que como no método que processa o arquivo eu vou indicar o tipo de arquivo acho que não vai ter problema, o que você acham?
public class Main {
public List<?> lista;
public void criarLista(){
List<Casa> listaCasa = new ArrayList<Casa>();
Casa casa = new Casa();
casa.setProprietario("Joao");
listaCasa.add(casa);
lista = listaCasa;
}
public void engenhariaReversa(){
@SuppressWarnings("unchecked")
List<Casa> listaCasa = (List<Casa>) lista;
for(Casa casa : listaCasa){
System.out.println("Proprietário: " + casa.getProprietario());
}
}
public static void main(String[] args) {
Main main = new Main();
main.criarLista();
main.engenhariaReversa();
}
}
Se existe um padrão x para documentos do tipo casa, um y para apartamentos e assim por diantes, podes criar apenas um ENUM e posteriormente um SWITCH para identificar qual o tipo de objeto que você vai utilizar. Não há necessidade de reflection ou coisa do tipo.