Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

nym-ph

Aceder a diferentes tipos de Objectos dentro de um ArrayList

Mensagens Recomendadas

nym-ph

Boas Noites pessoal!

Estou aqui com uma dificuldade num trabalho para a cadeira de programação, será que poderiam dar-me um empurrãozinho pff?

Tenho uma classe Station, e respectivas sub classes,

Station

StationMetro

StationMetroExterna

StationBus

StationTrain

Carreguei dentro de um ArralyList stationsList, todas as estações de um dado ficheiro...

Agora preciso de aceder ao ArrayList,

Se fizer,

StationsList.get(i).getStationName();

retorna o stationName, pois está definido na Classe Station. A classe mãe!

Mas se em i, tiver um objecto to tipo StationTrain, e tentar aceder ao método getCost(), que é especifico desta Classe

stationsList.get(i).getCost();

Ele dá-me Cannot be resolved to a field...

Entretanto lembrei-me que posso fazer um ArrayList, com ArrayLists lá dentro... o que talvez conseguisse resolver o problema, pois cada ArrayList poderia ter um tipo de objecto... Mas aumentava-me imenso a complexidade para depois fazer o que pretendo...

Já tentei isto também,

(StationTrain)stationsList.get(i).getCost();

mas sem sucesso...

Alguém sabe como posso aceder aos objectos que lá tenho dentro? Tinha a ideia que poderia guardar dentro de um ArrayList qualquer tipo de objectos que pretendesse...

Obrigado pessoal!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Tendo um ArrayList<Station>, podes lá colocar qualquer objecto que seja do tipo Station ou qualquer sub-tipo deste (subclasse, portanto). No entanto, para invocares métodos sobre esses objectos, apenas aqueles que são comuns a todas as classes dessa hierarquia podem ser invocados da forma normal (como verificaste). Se, no entanto, quiseres invocar um método que seja específico de uma dada subclasse, terás de testar qual o tipo do objecto sobre o qual estás a invocar o método, para garantir que é um tipo (uma classe) que implementa esse método. Tens também de converter o objecto em questão para o tipo específico:

Station s = stationList.get(i);
if (s.getClass().getSimpleName().equals("StationTrain")) {
    s = (StationTrain)s;
    s.getCost();
}

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
shumy

é mais adequado usar o instanceof.


Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Se queres aceder a métodos específicos de cada sub-classe, que não existem nem fazem sentido existir na super-classe (porque se fizerem sentido então deviam lá estar ;) ), porque não usar listas diferentes?

Usar apenas uma lista para guardar todos os objectos que partilham uma mesma hierarquia é uma boa opção quando não queres fazer deles nada além do que a classe comum oferece, se queres fazer coisas diferentes apenas com alguns deles então cria uma lista apenas para esse caso. Com isto evitas comparações desnecessárias e, pelo menos com a informação que deste, simplificas o código.

Usar o operador instanceof não é mais adequado. É um operador a evitar e é um operador que raramente é necessário usar, a maioria dos casos onde o sugerem são situações onde se pode facilmente simplificar o código e evitar um operador bastante dispendioso.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
shumy

Não estava a presumir o objectivo do código, se podes evitar instanceof porreiro. Apenas é melhor opção que:  s.getClass().getSimpleName().equals("StationTrain")


Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
shumy

Nem era por ai. Era simplesmente pelo facto de estares a comparar strings, o que não me parece melhor que um instanceof. Para não falar que esse método pode falhar redondamente, tem em conta que o getSimpleName() não te garante um valor único.


Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
shumy

Valor único tem a ver com o facto poderes ter duas classes com o mesmo nome em packages diferentes, já que o getSimpleName() descarta os packages.

Comparação de tipos é menos propicia a erros humanos (como já reparaste) e é tecnicamente mais rápido. Nem é que a diferença seja notável, mas se o java fornece uma ferramenta apropriada para fazer estas comparações, então para que inventar?


Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.