List get (como acessar métodos da subclasse) ?

import java.util.ArrayList;
import java.util.List;

import javax.swing.JOptionPane;

public class Main
{
    private static final int INCLUIR_A_ESP = 1;
    private static final int INCLUIR_A_MESTDOUT = 2;
    private static final int LISTAR = 3;
    private static final int SAIR = 4;
    private static int opcao, i, nRegistro;

    public static void main(String[] args)
    {
	boolean continuar = true;
	List<Aluno> lista = new ArrayList<Aluno>();
	
	while(continuar)
	{
	    opcao = Integer.parseInt(JOptionPane.showInputDialog(
		    "Escolha a opcao:\n1) Cadatrar Aluno Especificação.\n2) Cadastrar Aluno Metrado ou Doutorado.\n3) Listar Alunos.\n4) Sair."));
	    if(opcao == INCLUIR_A_ESP)
	    {
		Especificacao espec = new Especificacao();
		espec.setNome(JOptionPane.showInputDialog("Digite o nome do aluno:"));
		espec.setCodMat(Integer.parseInt(JOptionPane.showInputDialog("Digite o codigo de matricula do aluno:")));
		espec.setNumCred(Integer.parseInt(JOptionPane.showInputDialog("Digite o numero de creditos cadastrados do aluno:")));
		espec.setMonografia(Boolean.parseBoolean(JOptionPane.showInputDialog("Aluno fez a monografia? Sim ou Não?")));
		lista.add(espec);
	    }
	    
	    else if(opcao == INCLUIR_A_MESTDOUT)
	    {
		MestDout md = new MestDout();
		md.setNome(JOptionPane.showInputDialog("Digite o nome do aluno:"));
		md.setCodMat(Integer.parseInt(JOptionPane.showInputDialog("Digite o codigo de matricula do aluno:")));
		md.setNumCred(Integer.parseInt(JOptionPane.showInputDialog("Digite o numero de creditos cadastrados do aluno:")));
		md.setTitulo(JOptionPane.showInputDialog("Digite o titulo da tese:"));
		md.setData(JOptionPane.showInputDialog("Digite a data da defesa:"));
		md.setConceito(Float.parseFloat(JOptionPane.showInputDialog("Digite o titulo da tese:")));
		lista.add(md);
	    }
	    
	    else if(opcao == LISTAR)
	    {
		nRegistro = lista.size();
		
		for(i=0;i<nRegistro;i++)
		{
		    String sTexto = "";
		    sTexto += "\nNome do Aluno: " + lista.get(i).getNome();
		    sTexto += "\nCódigo da matriculo: " + lista.get(i).getCodMat();
		    sTexto += "\nNumero de creditos cadastrados: " + lista.get(i).getNumCred();
		    
		    //QUERO TESTAR VER SE O REGISTRO EM QUESTÃO POSSUI lista.get(i).getTitulo() para ver se é 
		    //aluno do tipo Especificacao ou MestradoDoutorado
		    //Como proceder?
		    /*
		    if()
		    {
			sTexto += "\n";
		    }
		    */
		}
	    }
	    
	    else if(opcao == SAIR)
	    {
		continuar = false;
	    }
	}
    }
}


public class Aluno
{
    private String nome;
    private int codMat, numCred;
    
    public Aluno()
    {
	this.nome = "";
	this.codMat = 0;
	this.numCred = 0;
    }
    
    public Aluno(String sNome, int iCodMat, int iNumCred)
    {
	this.nome = sNome;
	this.codMat = iCodMat;
	this.numCred = iNumCred;
    }


    public String getNome()
    {
	return nome;
    }

    public void setNome(String nome)
    {
	this.nome = nome;
    }
    
    public int getCodMat()
    {
	return codMat;
    }

    public void setCodMat(int codMat)
    {
	this.codMat = codMat;
    }
    
    public int getNumCred()
    {
	return numCred;
    }

    public void setNumCred(int numCred)
    {
	this.numCred = numCred;
    }
}


public class Especificacao extends Aluno
{
    private boolean monografia;
    
    public Especificacao()
    {
	super();
	monografia = false;
    }

    public boolean getMonografia()
    {
	return monografia;
    }

    public void setMonografia(boolean monografia)
    {
	this.monografia = monografia;
    }
}



public class MestDout extends Aluno
{
    private String titulo, data;
    private float conceito;
    
    public MestDout()
    {
	super();
	this.titulo = "";
	this.data= "";
	this.conceito = 0;
    }

    public String getTitulo()
    {
	return titulo;
    }

    public void setTitulo(String titulo)
    {
	this.titulo = titulo;
    }

    public String getData()
    {
	return data;
    }

    public void setData(String data)
    {
	this.data = data;
    }

    public float getConceito()
    {
	return conceito;
    }

    public void setConceito(float conceito)
    {
	this.conceito = conceito;
    }
}

Amigo, se entendi o que você quer fazer, você pode utilizar o instanceof.
Estou no celular, não sei se vou conseguir postar o código no formato mas… segue:

Tente fazer algo assim:

if(lista.get(i) instanceof MestDout) {
    System.out.println("Instância de MestOut");
} else {
    System.out.println("Instância de outro tipo");
}

Espero ter ajudado! :slight_smile:

Abs

na verdade quero isso:

if(lista.get(i).getTitulo())
{
     sTexto += "\n";
}

Quero testar se o aluno cadastrado possui este campo, para pode saber de que classe ele é; porem o getTitulo é da subclasse MestDout , e estou conseguindo apenas os metodos da super, queria distinguir se o aluno é da Especificação ou da MestDout vendo se ele possui os campos que é de cada classe.

getTitulo()
getData()
getConceito()
getMonografia()

Todos os objetos que estão na lista tem o método getTitulo() ou só objetos do tipo MestDout?
Só os dos tipo MestDout, certo?

Logo, para que você possa acessar esse método você precisa identificar se o objeto é desse tipo e se for, fazer o cast para MestDout.

E pra saber de qual tipo o objeto é usa-se o instanceof

if(lista.get(i) instanceof MestDout) {
    System.out.println(((MestDout) lista.get(i)).getTitulo());
}

mas no if eu quero testar se eu consigo pegar o gettitulo e ver se esta vazio.
exemplo:

if(lista.get(i).getTitulo() != "") //sei que não se compara string assim, é só pra entender minha ideia
{
   sTexto += " bla bla bla";
}
if(!lista.get(i).getTitulo().isEmpty()) //sou novato em java acho que seria algo assim
{
   sTexto += " bla bla bla";
}
if(lista.get(i) instanceof MestDout) {
    if(!((MestDout)lista.get(i)).getTitulo().isEmpty()) {
        sTexto += " bla bla bla";
    }
}

Funcionou?

não, pede pra mudar o cast pra boolean, e quando muda diz que getTitulo não existe em Aluno.

Primeiramente, inclua na classe Aluno os métodos vazios:

public void setTitulo(String titulo)
{

}
 
  public void setData(String data)
  {

  }
  
   public void setConceito(float conceito)
   {

   }
   
    public void setMonografia(boolean monografia)
   {

   }

Após, modifique o Main:

public class Main {
    
private static final int INCLUIR_A_ESP = 1;
    private static final int INCLUIR_A_MESTDOUT = 2;
    private static final int LISTAR = 3;
    private static final int SAIR = 4;
    private static int opcao, i, nRegistro;
    private static Aluno aluno;// modifiquei
    
    public static void main(String[] args)
    {
	boolean continuar = true;
	List<Aluno> lista = new ArrayList<Aluno>();
	
	while(continuar)
	{
	    opcao = Integer.parseInt(JOptionPane.showInputDialog(
		    "Escolha a opcao:\n1) Cadatrar Aluno Especificação.\n2) Cadastrar Aluno Metrado ou Doutorado.\n3) Listar Alunos.\n4) Sair."));
	    if(opcao == INCLUIR_A_ESP)
	    {
		aluno = new Especificacao();//perceba o polimorfismo
		aluno.setNome(JOptionPane.showInputDialog("Digite o nome do aluno:"));
		aluno.setCodMat(Integer.parseInt(JOptionPane.showInputDialog("Digite o codigo de matricula do aluno:")));
		aluno.setNumCred(Integer.parseInt(JOptionPane.showInputDialog("Digite o numero de creditos cadastrados do aluno:")));
		aluno.setMonografia(Boolean.parseBoolean(JOptionPane.showInputDialog("Aluno fez a monografia? Sim ou Não?")));
		lista.add(aluno);
	    }
	    
	    else if(opcao == INCLUIR_A_MESTDOUT)
	    {
		aluno = new MestDout();//perceba o polimorfismo
		aluno.setNome(JOptionPane.showInputDialog("Digite o nome do aluno:"));
		aluno.setCodMat(Integer.parseInt(JOptionPane.showInputDialog("Digite o codigo de matricula do aluno:")));
		aluno.setNumCred(Integer.parseInt(JOptionPane.showInputDialog("Digite o numero de creditos cadastrados do aluno:")));
		aluno.setTitulo(JOptionPane.showInputDialog("Digite o titulo da tese:"));
		aluno.setData(JOptionPane.showInputDialog("Digite a data da defesa:"));
		aluno.setConceito(Float.parseFloat(JOptionPane.showInputDialog("Conceito?:")));//modifiquei ele pedia o título de novo

		lista.add(aluno);
	    }
	    
	    else if(opcao == LISTAR)
	    {
		nRegistro = lista.size();
		
		for(i=0;i<nRegistro;i++)
		{
		    String sTexto = "";
		    sTexto += "\nNome do Aluno: " + lista.get(i).getNome();
		    sTexto += "\nCódigo da matriculo: " + lista.get(i).getCodMat();
		    sTexto += "\nNumero de creditos cadastrados: " + lista.get(i).getNumCred();
		    
		    //QUERO TESTAR VER SE O REGISTRO EM QUESTÃO POSSUI lista.get(i).getTitulo() para ver se é 
		    //aluno do tipo Especificacao ou MestradoDoutorado
		    //Como proceder?
		    
		    if(lista.get(i) instanceof MestDout)//identifica qual classe foi instanciada
		    {
			sTexto += "\nAluno com mestrado";//um exemplo
                     
		    }
		    
		}
                
                
	    }
	    
	    else if(opcao == SAIR)
	    {
		continuar = false;
	    }
	}
    }

    
}
1 curtida

Tinha um erro no código que postei
Tente novamente por favor (editei o código)

Deu certo??

ok, até ai deu certo e entendi, porem dentro do if preciso pegar o valor do getTitulo, como proceder?
Na classe Aluno, coloquei os 3 Sets (em branco?) que me passou, não deveria ter os Gets?

A classe aluno deve ter os demais métodos?
Isso não quebra a coesão do seu modelo??
Quem deve ter o método getTitulo() não é somente a classe MestDout??

Se eu fosse você tiraria esses métodos da classe aluno.

Sobre o if… cara você deve mexer no if para ele se adaptar ao o que você quer…
Use o método getTitulo() (como já está sendo feito). A única diferença é que o código que postei verifica se ele é vazio, que é o que você disse que queria fazer.

Desculpe a msgm era pro jbezerrajr, referente a maneira que ele esboçou

ok, até ai deu certo e entendi, porem dentro do if preciso pegar o valor do getTitulo, como proceder?
Na classe Aluno, coloquei os 3 Sets (em branco?) que me passou, não deveria ter os Gets?

if(lista.get(i) instanceof MestDout) {
    if(((MestDout)lista.get(i)).getTitulo().equals("valor que você quer comparar") {
        sTexto += " bla bla bla";
    }
}

entendi, consegui ficou assim:

if(lista.get(i) instanceof MestDout)
{
      sTexto += "\nO Titulo da tese é: " + ((MestDout)lista.get(i)).getTitulo();
}

o cast seria pra fazer Aluno voltar a ser MestDout, assim conseguindo usar o getTitulo correto?

1 curtida