Duvida incompatibilidade de tipos [RESOLVIDO]

8 respostas
glock

Boa tarde galera, sou iniciante em java e estou com uma duvida:
no metodo editaPassageiro tenho uma instancia da classe Passageiro que chama o metodo pesquisaDePassageiro(): Passageiro passageiro = pesquisaDePassageiro();
Nesta declaração está dando um erro de incompatibilidade de tipos, no netbeans informa a seguinte mensagem: incompatibilidade de tipos requer sisnetBus.Passageiro e foi encontrado void. O que tenho que fazer para corrigir este erro??

// metodo que edita o cadastro de passageiro
    public static void editaPassageiro(){

        
        // Chama o metodo que exibe uma tela para o usuario com a opção de pesquisar pelo CPF ou RG
        Passageiro passageiro = pesquisaDePassageiro();

        if (passageiro != null) {

            JOptionPane.showMessageDialog(null, "Digite os dados para edição de pessoa física:", ">> Edita cadastro de passageiro <<", JOptionPane.INFORMATION_MESSAGE);
            passageiro.nome = JOptionPane.showInputDialog("Digite o nome:", passageiro.nome);
            passageiro.endereco = JOptionPane.showInputDialog("Digite o endereço:", passageiro.endereco);
            passageiro.cpf = JOptionPane.showInputDialog("Digite o CPF:", passageiro.cpf);
            passageiro.rg = JOptionPane.showInputDialog("Digite o RG:", passageiro.rg);

            // exibe mensagem informando que a alteração do cadastro foi realizado com sucesso
            JOptionPane.showMessageDialog(null, "Alteração realizada com sucesso!", ">> Edita cadastro de passageiro <<", JOptionPane.INFORMATION_MESSAGE);

            //exibe a lista de passageiros cadastrados
            listaDePassageirosCadastrados();
        }

    }

    // metodo que será utilizado para tela de pesquisa de passageiro com a opção de pesquisa por cpf e rg
    public static void pesquisaDePassageiro() {

        // Exibe uma tela para o usuario com a opção de pesquisar pelo CPF ou RG
        String mensagem = "Digite:\n";
        mensagem = mensagem + "4- Pesquisar pelo nome do passageiro.\n";
        mensagem = mensagem + "5- Pesquisar pelo CPF do passageiro.\n\n";

        int acaoDoUsuario = Integer.valueOf(JOptionPane.showInputDialog(null, mensagem, "Entrada", JOptionPane.QUESTION_MESSAGE));

        // Se o usuario digitar 4 será chamado o metodo comparaPassageiroPeloNome
        if (acaoDoUsuario == 4) {

            String nomeDoPassageiro = String.valueOf(JOptionPane.showInputDialog(null, "Digite o nome do passageiro:", "Entrada", JOptionPane.QUESTION_MESSAGE));
            comparaPassageiroPeloNome(nomeDoPassageiro);

        }
        // Se o usuario digitar 5 será chamado o metodo comparaPassageiroPeloCpf
        if (acaoDoUsuario == 5) {

            String cpf = String.valueOf(JOptionPane.showInputDialog(null, "Digite o CPF do passageiro:", "Entrada", JOptionPane.QUESTION_MESSAGE));
            comparaPassageiroPeloCpf(cpf);

        }
    }

[]'s

8 Respostas

Mephy

o seu método pesquisaDePassageiro() está como void, veja a assinatura:

public static void pesquisaDePassageiro()

isso significa que ele não apresenta nenhum tipo de retorno (void)…

você precisará assinar o método apresetando o tipo de retorno que o método apresenta

public static Passageiro pesquisaDePassageiro()

e então retornar um OBJETO da classe Passageiro, através do comando return

Passageiro objetoRetorno = new Passageiro(); // atribua as propriedades desejadas no objeto return objetoRetorno;

Isso faz com que você receba um valor (objeto), que será atribuido no seu objeto passageiro, no método editaPassageiro

dica: o comando return cancela a execução do método em questão :wink:

glock

o metodo entendi, porem o objetoRetorno não ficou claro:
tenho que instanciar a classe Passageiro dentro do PesquisaPassageiro:

Passageiro objetoRetorno = new Passageiro();

este new Passageiro() terei que colocar os atributos da classe Passageiro?

return objetoRetorno;

este return utilizo ele no final do metodo PesquisaPassageiro?

[]'s

Bruno_Ferreira1

glock:
o metodo entendi, porem o objetoRetorno não ficou claro:
tenho que instanciar a classe Passageiro dentro do PesquisaPassageiro:

Passageiro objetoRetorno = new Passageiro();

este new Passageiro() terei que colocar os atributos da classe Passageiro?

return objetoRetorno;

este return utilizo ele no final do metodo PesquisaPassageiro?

[]'s

seu problema esta nesta linha:

Passageiro passageiro = pesquisaDePassageiro();

passageiro ali se tornou uma variavel de instância, mas como você vai dar um valor a ela, se este método não te retorna nada?
este método precisa retornar um objeto Passageiro, ele não pode ser void, pra ser usado desta forma

por isso instancie um objeto Passageiro dentro do seu método, e retorne ele

Passageiro objetoRetorno = new Passageiro(); return objetoRetorno;

é o mesmo que escrevesse:

Passageiro passageiro = objetoRetorno
glock

mudei o metodo método pesquisaDePassageiro() que não retornava nada para ele retorna:

public static Passageiro pesquisaDePassageiro()

Instanciei a classe Passageiro dentro do metodo pesquisaPassageiro

Passageiro objetoRetorno = new Passageiro();

Aqui nesta instancia está dando um erro: new Passageiro(), aqui dentro tenho que colocar o cpf e o nome?
E depois terei realizar a pesquisa(Nome ou CPF) e modificar os dados do objeto e retornar no final do metodo é isto? Se for como faço isto?

[]'s

Mephy

essa palavra reservada new é o acesso ao método construtor… na sua classe Passageiro deve haver um ou mais métodos construtores (polimorfia) para que se possa criar um objeto dessa classe. O que seu método pesquisaDePassageiro() deve fazer, é instanciar um novo objeto da classe Passageiro, pesquisar o passageiro que você quer, atribuir ao objeto que será retornado todos os atributos (Nome, CPF) por setter (ou polimorfismo do construtor) e então retornar esse objeto…
ao final disso, o objeto que é igual ao retorno do método (passageiro = pesquisaDePassageiro()) será idêntico ao objeto que foi retornado, com os mesmos atributos, e sem a necessidade de acessar o construtor novamente, já que o objeto retornado já foi construído

glock
cara não entendi, poderia exemplificar para poder ficar mais claro? pq dentro do meu metodo pesquisaDePassageiro() instaciei um novo objeto da classe Passageiro:
Passageiro objetoRetorno = new Passageiro();
porem dá um erro no Passageiro() pq tem que passar os valores, porem eu terei os valores quando entrar nos if que o usuario entrara com o nome ou cpf e os if irá dar um return comparaPassageiroPeloNome ou comparaPassageiroPeloCpf, ai dentro dos if terei que colocar o objetoRetorno tbm? abaixo o metodo comparaPassageiroPeloNome e comparaPassageiroPeloCpf:
// metodo que irá comparar o nome do passageiro pelo nome fornecido pelo usuario
    public static Passageiro comparaPassageiroPeloNome(String nomeDoPassageiro) {

        int contador = 0;

        for (int i = 0; i < passageiros.size(); i++) {

            //obtem intens da lista passageiro
            Passageiro passageiro = passageiros.get(i);

            if (passageiro.nome.toUpperCase().equals(nomeDoPassageiro.toUpperCase())) {

                contador++;
                String mensagem = "---------------------------------------------------\n";
                mensagem += "Nome: " + passageiro.nome + "\n";
                mensagem += "Endereço: " + passageiro.endereco + "\n";
                mensagem += "CPF: " + passageiro.cpf + "\n";
                mensagem += "RG: " + passageiro.rg + "\n";

                JOptionPane.showMessageDialog(null, mensagem, ">> Pesquisa pelo nome <<", JOptionPane.INFORMATION_MESSAGE);

            }
        }
        if (contador == 0) {

            JOptionPane.showMessageDialog(null, "Passageiro não encontrado!", ">> Pesquisa pelo nome <<", JOptionPane.INFORMATION_MESSAGE);

        }

        return null;

    }
// metodo que irá comparar o cpf do passageiro pelo cpf fornecido pelo usuario
    public static Passageiro comparaPassageiroPeloCpf(String cpfDoPassageiro) {

        int contador = 0;

        for (int i = 0; i < passageiros.size(); i++) {

            //obtem itens da lista passageiros
            Passageiro passageiro = passageiros.get(i);

            if (passageiro.cpf.equals(cpfDoPassageiro)) {

                contador++;
                String mensagem = "---------------------------------------------------\n";
                mensagem += "Nome: " + passageiro.nome + "\n";
                mensagem += "Endereço: " + passageiro.endereco + "\n";
                mensagem += "CPF: " + passageiro.cpf + "\n";
                mensagem += "RG: " + passageiro.rg + "\n";

                JOptionPane.showMessageDialog(null, mensagem, ">> Pesquisa pelo cpf <<", JOptionPane.INFORMATION_MESSAGE);

            }
        }
        if (contador == 0) {

            JOptionPane.showMessageDialog(null, "Passageiro não encontrado!", ">> Pesquisa pelo cpf <<", JOptionPane.INFORMATION_MESSAGE);

        }

        return null;

    }

[]'s

Mephy
na classe Passageiro, inclua o seguinte método:
public Passageiro(){
   this.nome = "";
   this.cpf = "";
   // inicialize todos os atributos
}
// OU até mesmo, simplesmente:
public Passageiro(){} // método que não faz nada

isso serve simplesmente pra ele puxar na memória RAM, no espaço referencial do objeto, uma cópia dos dados contidos na classe Passageiro
depois eu falo que é bom aprender C++ OO antes de Java e ninguém entende o porquê :( (então fica a dica: se quiser saber como isso funciona fisicamente, www.cplusplus.com/doc/tutorial/classes/)

edit:
também tente pesquisar sobre escopo de variáveis em Java: se a variável objetoRetorno foi instanciada no método pesquisaDePassageiro(), assim que o método termina, a variável é apagada da memória para não sobrecarregar a RAM (processo conhecido como GarbageCollector)

edit2: já que quer um pouquinho de prática:
public static Passageiro pesquisaDePassageiro() { // isso com aquele construtor que postei acima na classe Passageiro
   Passageiro ret = new Passageiro(); // guarda na RAM o objeto ret, com os atributos e métodos da classe Passageiro
   ret.setCPF("555555555-55"); // acessa método setter do atributo CPF, para dar um valor ao CPF
   ret.setNome("João"); // acessa método setter do atributo Nome. É claro que a classe Passageiro tem que ter os métodos mutator (setters)
   return ret; // manda o objeto de volta pra quem chamou o método pesquisaDePassageiro()
}

public static void editaPassageiro() {
   Passageiro passageiro = pesquisaDePassageiro(); // usamos o método pesquisaDePassageiro(), gravando seu retorno na variável passageiro
   String cpf = passageiro.getCPF(); // declaramos uma String que usa o método acessor (getter) de CPF
   String nome = passageiro.getNome(); // óbvio também, a classe Passageiro deve conter os métodos acessors
   System.out.println("CPF: " + cpf);
   System.out.println("Nome: " + nome);
}
o output disso na tela é:
555555555-55
João

se conseguiu entender isso, já é um bom caminho a entender algo maior .-.

glock

cara vlw pela sua ajuda e as dicas, vi que dava para fazer de um modo diferente:
no metodo comparaPassageiroPeloNome e comparaPassageiroPeloCpf coloquei um return passageiro no final do if e deu certo.

Muito obrigado pela ajuda de vcs.

[]'s

Criado 8 de abril de 2011
Ultima resposta 11 de abr. de 2011
Respostas 8
Participantes 3