Array de Objects (não objetos) em Java - Como usar - Stack Overflow em Português
Tenho a seguinte tarefa a fazer:
Eu tenho três tipos de funcionários (Commissioned, Salaried and Hourly) e tenho que adicioná-los em uma lista (ArrayList) para poder geri-los.
ArrayList<Commissioned> c = new ArrayList<>();
ArrayList<Hourly> h = new ArrayList<>();
ArrayList<Salaried> s = new ArrayList<>();
Eu preciso que todos eles estejam em um único Array. Eu poderia criar uma interface Employees, implementar Employees em cada uma das classes e fazer um
ArrayList<Employees> employees = new ArrayList<>();
mas não é isso de que preciso.
O que eu tenho que fazer, é
ArrayList<Objects> employees = new ArrayList<>();
Porém eu não sei como trabalhar com estes empregados em um Array de Objects. Como usar coisas como instanceof ou casting de objetos.
O que eu gostaria de saber fazer:
Descobrir se um item desse ArrayList é uma instância da classe Commissioned, Salaried ou Hourly. E como usar os métodos de cada um dos itens do array, vistos que os métodos de cada classe são diferentes.
Obs1: Caso queiram ver como está sendo implementado o projeto atualmente: https://github.com/WilliamPhilippe/Projeto-de-Software/tree/master/FolhadePagamentos/src/com/company
Esta em na classe Working Linha 11
Obs2: Pesquisei bastante na internet, mas não consegui encontrar coisas sobre Array de Objects, apenas sobre Array de objetos.
editada 3/06 às 17:47
perguntada 12/05/2019 às 3:14
William PhilippeWilliam Philippe
Willian Philippe: A pergunta possui algumas resposta. Ela lhe foram úteis? Caso tenham o ajudado considere aceitar uma delas. Leia O que eu devo fazer se alguém responder minha pergunta? e Como e por que aceitar uma resposta?.
15/11/2019 às 11:57
Criei três classes:
Para simplificar o exemplo adicionei apenas um campo a cada classe:
Commissioned.name,
Hourly.age
Salaried.salary.
Copiei os ArrayList c, h e s da sua pergunta e os populei com um objeto cada.
Criei o ArrayList<Object> employees e o populei com c, h e s.
Não usei ArrayList<Objects> como na pergunta pois Objects é uma classe utilitária constituída de métodos estáticos para operar sobre objetos.
Então para cada objeto em employees eu peguei sua classe com o método getClass() e comparei com uma das classe Commissioned, Hourly e Salaried. Caso a comparação seja bem sucedida eu fiz a conversão de casta de Objectpara o tipo comparado e atribui um valor a propriedade intrínseca a cada classe.
Repeti o mesmo processo só que em vez de atribuir eu imprimi o valore já atribuídos a cada tipo.
//Copiei da pergunta
//Popula cada ArrayList com um objeto
c.add(new Commissioned());
h.add(new Hourly());
s.add(new Salaried());
//Cria um ArrayList<Object>
ArrayList<Object> employees = new ArrayList<>();
//Passa "c", "h" e "s"  para employees
employees.addAll(c);
employees.addAll(h);
employees.addAll(s);
//itera sobre employees
for(Object employ : employees){
//Faz a comparação do objeto com a classe
if (employ.getClass() == Commissioned.class){
//Faz a conversão de casta para o tipo adequado e atribui valor
((Commissioned)employ).name = "João";
if (employ.getClass() == Hourly.class){
((Hourly)employ).age = 30;
if (employ.getClass() == Salaried.class){
((Salaried)employ).salary = 500.50f;
} else throw new Exception("Objeto desconhecido");
System.out.println("Commissioned name:" + ((Commissioned)employ).name);
System.out.println("Hourly age:" + ((Hourly)employ).age);
System.out.println("Salaried salary:" + ((Salaried)employ).salary);
//Declaração hipotética de classes
class Commissioned{
class Hourly{
class Salaried{
editada 15/11/2019 às 11:55
respondida 12/05/2019 às 5:03
Se eu precisar adicionar um novo empregado em "employees" eu posso fazer employees.add(newEmployee) ou eu tenho que adicionar em "c" ou "h" ou "s" antes?
– William Philippe
12/05/2019 às 16:06
Não é obrigatório. Na verdade você pode deletar "c", "h" e "s" e ficar só com employees. Eu os usei para acompanhar o raciocínio da pergunta.
12/05/2019 às 16:18
Há alguma razão específica para usar employ.getClass() == X.class ao invés de employ instanceof X?
12/05/2019 às 16:36
@Douglas eu usei por conta da facilidade da leitura do código. Pessoalmente prefiro o uso de instanceof.
Seguindo sua lógica, poderia fazer assim:
//Atribuição das classes a ArrayObject, e o que mais você quiser, String, Long, etc;
employees.add("Minhas classes!");
employees.add(c);
employees.add(h);
employees.add(s);
//Agora a leitura das classes, vou criar uma fun para setar os dados;
public void setItemViewType(ArrayList<Object> employees) {
for(int position=0; position<itensMeusDados.size(); position++){
if (employees.get(position) instanceof Commissioned) {
ArrayList<Commissioned> c2= (Commissioned) employees.get(position);
} else if (employeesTeste.get(position) instanceof Hourly) {
ArrayList<Hourly> h2= (Hourly) employees.get(position);
} else if (employees.get(position) instanceof Salaried){
ArrayList<Salaried> s2= (Salaried) employees.get(position);
} else if (employees.get(position) instanceof String){
String titulo = (String) employees.get(position);
setItemViewType(employees);
respondida 12/05/2019 às 5:25
Esta não é a resposta que você está procurando? Pesquise outras perguntas com a tag java array orientação-a-objetos classes objetos ou faça sua própria pergunta.