[Resolvido]ArrayList de Objetos

Seguinte, estou com uma dúvida de como adicionar um Object a um ArrayList. Explicando, vou ter um ArrayList pra vendedores e um ArrayList pros demais funcionários de uma empresa “Y”, mas preciso adicionar nesses arrays não um objeto tipo “funcionario”, mas sim um Object funcionario.
Será que alguém poderia me dar uma luz? Estou tentando a horas, e o mais próximo do que consegui estou postando aqui…O erro aparece nas linhas 50 e 52(ao adicionar os objetos nos arrays).

[code]import java.util.ArrayList;
import java.util.Scanner;

public class Empresa {

ArrayList<Vendedor> vend;
ArrayList<Funcionario> func;
	
public Empresa(){
vend = new ArrayList();
func = new ArrayList();
}

public static void main(String[] args) {
	
	int op;
	Empresa emp = new Empresa();
	Object obj1,obj2,obj3,obj4;
	Scanner opcao = new Scanner(System.in);
	Scanner in = new Scanner(System.in);

	do{
		System.out.println("*****Corporação Sem Limites SA*****\nDigite A opção desejada:");
		System.out.println("1 - Cadastro de Funcionário;");
		System.out.println("2 - Cadastro de Vendedor;");
		System.out.println("3 - Excluir Funcionário;");
		System.out.println("2 - Excluir Vendedor;");
		System.out.println("0 - Encerrar o Sistema.");
		op = opcao.nextInt();
		switch(op){
		case 1:
			System.out.println("Digite o codigo do funcionario: ");
			int codigo = in.nextInt();
			in.nextLine();
			System.out.println("Digite o nome do funcionario: ");
			String nome = in.nextLine();
			System.out.println("Digite o salario do funcionario: ");
			double salario = in.nextDouble();
			Funcionario funcionario = new Funcionario(codigo,nome,salario);
			obj1 = funcionario;
			emp.insereFuncionario(obj1);
		case 2:
			//Inserir vendedor...
		}
	}while(op != 0);
	
	}
	public void insereFuncionario(Object x){
		if(x.getClass().toString().equals("Class Funcionario")){
			func.add(x);
		}else{
			vend.add(x);
		}
			

}

}
[/code]

Qual o erro ta dando? To achando que ta faltando fazer o cast.

func.add((Funcionario)x);  
vend.add((Vendedor)x);  

Desculpe por demorar a responder, é que só acesso a internet nessa faixa de horário…
Enfim, realmente, ao fazer o cast o erro deixou de exixtir, mas passou a ocorrer um erro em tempo de execução :?

Exception in thread “main” java.util.InputMismatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextDouble(Unknown Source)
at Empresa.main(Empresa.java:38)

Boa noite a todos.

Em primeiro lugar, corrija o seu construtor assim:

    ArrayList<Vendedor> vend;  
    ArrayList<Funcionario> func;  
    
    // Substitua este construtor
    public Empresa(){  
        vend = new ArrayList();  
        func = new ArrayList();  
    }

    // Por este;  
          
    public Empresa(){  
        vend = new ArrayList<Vendedor>();  
        func = new ArrayList<Funcionario>();  
    }

Em segundo lugar, acho que o seu código ficaria melhor distribuído desta forma:


public static void main(String[] args) {  
          
        int op;  
        Empresa emp = new Empresa();   
        Scanner opcao = new Scanner(System.in);  
        Scanner in = new Scanner(System.in);  
  
        do{  
            System.out.println("*****Corporação Sem Limites SA*****\nDigite A opção desejada:");  
            System.out.println("1 - Cadastro de Funcionário;");  
            System.out.println("2 - Cadastro de Vendedor;");  
            System.out.println("3 - Excluir Funcionário;");  
            System.out.println("2 - Excluir Vendedor;");  
            System.out.println("0 - Encerrar o Sistema.");  
            op = opcao.nextInt();  
            switch(op){  
            case 1:  
                System.out.println("Digite o codigo do funcionario: ");  
                int codigo = in.nextInt();  
                in.nextLine();  
                System.out.println("Digite o nome do funcionario: ");  
                String nome = in.nextLine();  
                System.out.println("Digite o salario do funcionario: ");  
                double salario = in.nextDouble();  
                Funcionario funcionario = new Funcionario(codigo,nome,salario);  
                func.add(Funcionario); 
            case 2:  
                //Inserir vendedor...
                ......
                Vendedor vendedor = new vendedor(codigo,nome,salario);  
                vend.add(vendedor);
            }  
        }  while(op != 0);  
          
        }  
       
    }

Ora, se voce já sabe que opção 1 é adicionar Funcionário e a opção 2 é adicionar o vendedor, então porque não fazê-la direta dentro do desvio condicional “switch”, tornou-se também desnecessário a criação dos Obj1, Obj2 e etc.

E para que voce instanciou um objeto Empresa se não o está usando :?:

Um abraço.
Jorge da Silva Abreu

caso queira unir as duas listas, voce adiciona o objeto em cada lista, atraves do metodo add, cada um em sua lista, ai depois voce cria uma lista generica, e adiciona todos dentro dela, tipo asim:

  List l = new ArrayList();
  l.addAll(funcionarios);
  l.addAll(vendedores);

mas nao sei se eh uma boa ideia, se voce for realizar uma busca depois, tenta alguma coisa com relação a herança.

Brow seria uma boa vc criar um classe pai para vendedor e funcionario do tipo Pessoa talvez …

e criar um método que receba como parametro a classe pai deles no caso a Pessoa

ficaria assim:

class Pessoa{

}

class Funcionario extends Pessoa{

}

class Vendedor extends Pessoa{

}

e a chamada do método ficaria assim:

public void insereFuncionario(Pessoa x){   
     if(x instanceof Funcionario){   
           func.add(x);
     }else{   
          vend.add(x);   
     }     
} 

e as listas ficariam com o objeto genérico do tipo Pessoa

List<Pessoa> vend = new ArrayList<Pessoa>();   
List<Pessoa> func = new ArrayList<Pessoa>();

ou vc faz o cast como os amigos já falaram.

Bom dia a todos.

A meu ver ele não deveria separar vendedor de funcionário, visto que o vendendor não deixa de ser um funcionário.

No caso o vendedor teria que ser um dado armazenado no atributo chamado “Cargo”, pois já pensou voce ter que criar uma classe para cada tipo de cargo em um Empresa de grande porte, por exemplo a Volkswagen, ter que criar classe para Atendente, Secretária, Diretor, Vendedor, Gerente de Compras, Mecânico, Montador e etc.

Muita das vezes, existe alguns exemplos desse tipo, vendedor e funcionário, apenas para ilustrar como funciona o paradigma de orientação a objetos, contudo acho que se deveria ensinar da maneira correta de como fazer a coisa, como por exemplo uma classe Funcionário e outra Cliente, ambas herdando (extendendo) de Pessoa, como já foi dito aqui, partindo do conceito de que nem todas as pessoas são Funcionários e ou Clientes, porém todo Cliente e todo Funcionário, são Pessoas.

Um abraço.
Jorge da Silva Abreu

[quote=discorpio]Bom dia a todos.

A meu ver ele não deveria separar vendedor de funcionário, visto que o vendendor não deixa de ser um funcionário.

[/quote]

Boa tarde,

Então, o que acontece é que esse é um exercício que o professor pediu na faculdade. Não está valendo nota nem nada do tipo, mas estou curioso pra por isso pra funcionar.
Também questionei no dia sobre o fato do vendedor ser um funcionário, então, entendo o que quis dizer.
Mas assim, o que ele pediu no exercício é que fossem passados os vendedores pra um Array e os demais funcionários pra outro, mas ele quer que sejam adicionados os “Object vendedores”, no meu caso, criei obj1, obj2…E em outro Array os demais funcionários seriam cadastrados. Após eu resolver esse problema da criação dos funcionários e vendedores, terei que fazer uma classe “Gerente extends Funcionario”, onde essa classe terá métodos que determinarão o salário do gerente de acordo com a quantidade de vendedores no Array…Mais ou menos isso.

Bom, continuando a questão, o eclipse não me aponta erros no código, mas em tempo de execução ocorre a seguinte mensagem:

Exception in thread “main” java.lang.ClassCastException: Funcionario cannot be cast to Vendedor
at Empresa.insereFuncionario(Empresa.java:63)
at Empresa.main(Empresa.java:43)

Não sei bem, mas parece haver algo com o cast que faço no meu método “Insere”.

Atualmente, meu código está assim:

import java.util.ArrayList;
import java.util.Scanner;

public class Empresa {
	
	ArrayList<Vendedor> vend;
	ArrayList<Funcionario> func;
		
	public Empresa(){
	vend = new ArrayList<Vendedor>();
	func = new ArrayList<Funcionario> ();
	}
	
	public static void main(String[] args) {
		
		int op;
		Empresa emp = new Empresa();
		Object obj1,obj2,obj3,obj4;
		Scanner opcao = new Scanner(System.in);
		Scanner in = new Scanner(System.in);

		do{
			System.out.println("*****Corporação Sem Limites SA*****\nDigite A opção desejada:");
			System.out.println("1 - Cadastro de Funcionário;");
			System.out.println("2 - Cadastro de Vendedor;");
			System.out.println("3 - Excluir Funcionário;");
			System.out.println("4 - Excluir Vendedor;");
			System.out.println("0 - Encerrar o Sistema.");
			op = opcao.nextInt();
			switch(op){
			case 1:
				System.out.println("Digite o codigo do funcionario: ");
				int codigo = in.nextInt();
				in.nextLine();
				System.out.println("Digite o nome do funcionario: ");
				String nome = in.nextLine();
				System.out.println("Digite o salario do funcionario: ");
				double salario = in.nextDouble();
				Funcionario funcionario = new Funcionario(codigo,nome,salario);
				obj1 = funcionario;
				emp.insereFuncionario(obj1);
			case 2:
				System.out.println("Digite o codigo do vendedor: ");
				int cod = in.nextInt();
				in.nextLine();
				System.out.println("Digite o nome do vendedor: ");
				String nm = in.nextLine();
				System.out.println("Digite o salario do vendedor: ");
				double sal = in.nextDouble();
				Vendedor vendedor = new Vendedor(cod,nm,sal);
				obj2 = vendedor;
				emp.insereFuncionario(obj2);
			}
		}while(op != 0);
		
		}
		public void insereFuncionario(Object x){
			if(x.getClass().toString().equals("Class Funcionario")){
				func.add((Funcionario)x);
			}else{
				vend.add((Vendedor)x);
			}
				

	}
}

Boa tarde a todos.

Então neste caso acho que voce deveria seguir o exemplo do meu primeiro post, onde continuo achando desnecessário a criação dos Obj1, Obj2 …e etc, se não vejamos, quando voce cria esses objetos assim:

    // Funcionário
    Funcionario funcionario = new Funcionario(codigo,nome,salario);   
    obj1 = funcionario;

    // Vendedor
    Vendedor vendedor = new Vendedor(cod,nm,sal);   
     obj2 = vendedor;

O que vai ocorrer acima é que as variáveis funcionario e obj1 vão ser a mesma instância de Objeto Funcionário, visto que obj1 vai ser cópia de Funcionário, isto que dizer que eles vão compartilhar o mesmo endereço de memória, ou seja, se voce alterar qualquer atributo de funcionario, a mesma alteração será feita em obj1 por um processo conhecido como “Efeito Colateral” e eu acho que já dei essa dica aqui no GUJ. O mesmo acontece com as instâncias vendedor e obj2.

A medida que voce vai dando new Funcionario em funcionario e obj1 vai copiando seu endereço com o operador “=”, os objetos antigos são removidos da memória, o mesmo acontecendo com vendedor e obj2, e quanto a obj3 e obj4, o que seriam. Então se eu vou ter apenas uma instância de um objeto em duas variáveis, só para passá-la como parâmetro do método “insereFuncionario”, porque não passar com apenas uma, ou seja as instâncias vendedor e funcionario, assim:

   emp.insereFuncionario(funcionario);
   // ou
   emp.insereFuncionario(vendedor);

Além disso, já foi dito pelo nosso amigo Kritiuns, que o método insereFuncionario ficaria melhor assim:

    public void insereFuncionario(Object x){     
        if(x instanceof Funcionario){     
             func.add(x);   
        }else{     
             vend.add(x);     
        }       
    }   

O erro de casting ocorre porque o nome da Classe é “Funcionario” e não "Class Funcionario’, dai ele não fazer a distinção do objeto.

Por outro lado, também acho desnecessário este método insereFuncionario, visto que no primeiro post, expliquei que se no desvio condicional, dentro da opção, voce já faz a distinção de qual array vai inserir 1 - Funcionario, 2 - vendedor, então faça a inclusão no array respectivo direto na opção “switch”, assim voce evita o desdobramento de se compilar mais código.

switch(op){     
            case 1:     
                System.out.println("Digite o codigo do funcionario: ");     
                int codigo = in.nextInt();     
                in.nextLine();     
                System.out.println("Digite o nome do funcionario: ");     
                String nome = in.nextLine();     
                System.out.println("Digite o salario do funcionario: ");     
                double salario = in.nextDouble();     
                Funcionario funcionario = new Funcionario(codigo,nome,salario);     
                func.add(Funcionario);
                break;   // voce esqueceu do break   
            case 2:     
                //Inserir vendedor...   
                ......   
                Vendedor vendedor = new vendedor(codigo,nome,salario);     
                vend.add(vendedor);   
                break;
}

discorpio ,

Consegui resolver essa parte do problema onde estava empacado.
Suas dicas foram muito importantes, assim como as dos demais membros do fórum que tentaram ajudar com muuuuuuuuuuuita paciência :slight_smile:
Meu problema todo é que estou restrito ao que o professor pede, aí não tenho muito o que mudar.
A questão do “Efeito Colateral”, vou esclarecer essa dúvida com o professor na aula.
Por fim, o cast que espero na verificação me retorna a expressão “class Funcionario” ou “class Vendedor”, onde utilizei o "toString do Java pra me retornar essa expressão e fazer a comparação de qual array seria utilizado pra armazenar o objeto.

Agradeço muito pela ajuda!!!
Devem aparecer novas dúvidas em breve, sempre aparecem…Então, nos vemos pelo fórum!