Duvida em codigo com Generics

23 respostas
F

Olá pessoal, sou novo aqui no forum e logo de cara gostaria da ajuda de vocês.
Ainda estou aprendendo a usar Generics, então estou me batendo um pouco, alguem poderia me dar uma ajuda?

Estou tendo problema nesse codigo:
import java.io.Serializable;


public class ListaSeqOrd<E> extends ListaSeq implements Serializable{
	private E[] lista;
	private int numElementos;	
	
	public ListaSeqOrd() {
		super();		
	}

	public ListaSeqOrd(int tamanhoInicial, int incremento) {
		super(tamanhoInicial, incremento);		
	}

	public ListaSeqOrd(int tamanhoInicial) {
		super(tamanhoInicial);		
	}
	protected int findPosition(Comparable<E> obj){
		   int inicio, fim, meio, c;
		   inicio = 0;
		   fim    = numElementos-1;
		   while (inicio <= fim){
		      meio = (inicio + fim)/2;
		      c = obj.compareTo(lista[meio]);
		      if (c == 0)
		         return meio;
		      if (c > 0)
		         inicio = meio + 1;
		      else
		         fim = meio - 1;
		   }
		   return -1;
		}
	
	public void delete(Comparable<E> obj){
		   int posicao = findPosition(obj);
		   if (posicao >= 0){
		      for (int i = posicao; i < (numElementos-1); i++) {
		         lista[i] = lista[i+1];
		      }
		      numElementos--;
		      lista[numElementos] = null;
		   }
		}

	
	public void insert(Comparable<E> obj){
		   redimensione();
		   int posicao = findPositionInsert(obj);
		   numElementos++;
		   for (int i = numElementos - 1; i > posicao; i--) {
		      lista[i] = lista[i-1];
		   }
		   lista[posicao] =  obj;  //Aqui esta dando o erro:" Type mismatch: cannot convert from Comparable<E> to E "
		}
	
	private int findPositionInsert(Comparable<E> obj){
		   int inicio, fim, meio, c;
		   inicio = 0;
		   fim    = numElementos-1;
		   while (inicio <= fim){
		      meio = (inicio + fim)/2;
		      c = obj.compareTo(lista[meio]);
		      if (c > 0)
		         inicio = meio + 1;
		      else
		         fim = meio - 1;
		   }
		   return inicio;

	}
}

Que tem como superclasse:

import java.io.Serializable;


public class ListaSeq<E> implements Serializable {

	private E[] lista;
	private int numElementos;
	private int incremento;
	private int corrente;
	
	public ListaSeq(){
		   numElementos = 0;
		   incremento = 10;
		   lista = (E[]) new Object[10];
		}
	public ListaSeq(int tamanhoInicial){
		   numElementos = 0;
		   incremento = 10;
		   lista =(E[]) new Object[tamanhoInicial];
		}
	public ListaSeq(int tamanhoInicial,int incremento){
			numElementos = 0;
			this.incremento = incremento;
			lista = (E[]) new Object[tamanhoInicial];
		}
	protected void redimensione(){
		   if (numElementos == lista.length){
		      Object[] novoVetor = new Object[numElementos +
		                                      incremento];
		      System.arraycopy(lista, 0, novoVetor, 0, numElementos);
		      lista =(E[]) novoVetor;
		   }
		}
	private int findPosition(Comparable<E> obj){
		   for (int i = 0; i < numElementos; i++) {
		      if (obj.compareTo(lista[i]) == 0)
		         return i;
		   }
		   return -1;
		}
	public void insert(E obj){
		   redimensione();
		   lista[numElementos] = obj;
		   numElementos++;
		}
	public boolean delete(Comparable<E> obj){
		   int posicao = findPosition(obj);
		   if (posicao >= 0){
		      for (int i = posicao; i < (numElementos-1); i++) {
		         lista[i] = lista[i+1];
		      }
		      numElementos--;
		      lista[numElementos] = null;
		      return true;
		   }
		   return false;
		}
	public boolean isThere(Comparable<E> obj){
		   return (findPosition(obj) >= 0);
		}
	public E retrieve(Comparable<E> obj){
		   int posicao = findPosition(obj);
		   if (posicao >= 0)
		      return lista[posicao];
		   else
		      return null;
		}
	public int length(){
		   return numElementos;
		}
	public Object getFirst(){
		   if (numElementos == 0)
		      return null;
		   else{
		      corrente = 0;
		      return lista[0];
		   }
		}
	public Object getNext(){
		   if (corrente == numElementos-1)
		      return null;
		   else
		      return lista[++corrente];
		}
	
}

23 Respostas

sergiolopes

se entendi bem o que voce quer fazer eh uma lista de elementos que sejam Comparable, certo?
se for isso, voce nao quer receber Comparable<E> nos metodos mas sim E onde E extends Comparable

algo assim:

public class ListaSeqOrd<E extends Comparable> extends ListaSeq<E> implements Serializable{

e os metodos deveriam receber E:

void delete (E e)
void insert (E e)

e só pra ser correto, se estiver pensando em elementos comparaveis entre si vc deveria usar ainda:

public class ListaSeqOrd<E extends Comparable<? super E>> extends ListaSeq<E> implements Serializable{

(igual Collections.sort)

[]'s
sergio

F

Estou completamente perdido.

As alterações propostas até resolveram algumas coisas, mas o principal que é quando a lista vai receber o obj não esta dando certo… :confused:

danilopelegrino

Então, o objeto lista é um array de “E”, ja o obj é do tipo Comparable.

é só alterar esta declaracao de:

private E[] lista;

para:

private Comparable<E>[] lista;

Abraço

sergiolopes

coloca o codigo que esta usando para chamar a lista

F

Bom então vamos lá né:

import java.io.Serializable;

import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MoveAction;

public class ContaCorrente implements Serializable, Comparable<ContaCorrente> {
	

	private int numConta;	
	private String nomeCliente;
	private float saldoInicial, saldoFinal, saldoParcial;
	
	
	ListaSeq listaMovimentos = new ListaSeq();

	public ContaCorrente(int numConta) {
		super();
		this.numConta = numConta;
	}

	public ContaCorrente(int numConta, String nomeCliente) {
		this.numConta = numConta;
		this.nomeCliente = nomeCliente;
	}

	public ContaCorrente(int numConta, String nomeCliente, float saldoInicial) {
		this.numConta = numConta;
		this.nomeCliente = nomeCliente;
		this.saldoInicial = saldoInicial;
		saldoFinal = saldoInicial;
	}
		
	public void saque(String data,float valor) {
		saldoFinal = saldoFinal - valor;
		Movimento movimento = new Movimento(data, 'D', valor);
		listaMovimentos.insert(movimento);
	}

	public void deposito(String data, float valor) {
		saldoFinal = saldoFinal + valor;
		Movimento movimento = new Movimento(data, 'C', valor);
		listaMovimentos.insert(movimento);
	}	
	
	public int getNumConta() {
		return numConta;
	}

	public float getSaldoParcial() {
		return saldoParcial;
	}

	public String getNomeCliente() {
		return nomeCliente;
	}
	
	public float getSaldoInicial() {
		return saldoInicial;
	}

	public float getSaldoFinal() {
		return saldoFinal;
	}

	public void imprimirExtrato(String tipoConta) {
		Keyboard.clrscr();
		
		System.out.println("Número da conta: " + numConta);
		System.out.println("Nome do cliente: " + nomeCliente);
		System.out.println("Tipo da conta: " + tipoConta);
		System.out.println("Data Mov      Valor     Tipo Mov  Saldo");
		System.out.println("------------  --------  --------  --------");
		saldoParcial = saldoInicial;
		Movimento movimento = (Movimento) listaMovimentos.getFirst();
		while (movimento != null){
			if (movimento.getTipoMov() == ('C')){
					saldoParcial = saldoParcial + movimento.getValor();						
			}
			else{
				saldoParcial = saldoParcial - movimento.getValor();					
			}			
			System.out.printf("%11s  %8.2f %6s %10.2f\n", movimento.getData(),movimento.getValor(),movimento.getTipoMov(),saldoParcial);	
			movimento =(Movimento) listaMovimentos.getNext();
			}
	}

	@Override
	public int compareTo(ContaCorrente conta) {
		if (numConta < conta.numConta)
			return(-1);
		if (numConta == conta.numConta)
			return (0);
		return(1);
		
	}
	
	

}
import java.io.Serializable;


public class ContaEspecial extends ContaCorrente implements Serializable{
	
	public float saldoNegativo;

	public ContaEspecial(int numConta, String nomeCliente, float saldoInicial, float saldoNegativo) {
		super(numConta, nomeCliente, saldoInicial);
		this.saldoNegativo = saldoNegativo;
	}

	public ContaEspecial(int numConta, String nomeCliente) {
		super(numConta, nomeCliente);
	}

	public float getSaldoNegativo() {
		return saldoNegativo;
	}	
	
	}
import java.io.Serializable;


public class ContaPoupanca extends ContaCorrente implements Serializable {

	
	
	public ContaPoupanca(int numConta, String nomeCliente, float saldoInicial) {
		super(numConta, nomeCliente, saldoInicial);
	}

	public ContaPoupanca(int numConta, String nomeCliente) {
		super(numConta, nomeCliente);
	}

	public void creditaRendimentos(String data, float taxa){	
		float valor= ((taxa / 100) * getSaldoFinal());
		Movimento movimento = new Movimento(data, 'C', valor);
		listaMovimentos.insert(movimento);
				
	}

}
public class Demo {

	static ListaSeqOrd listaContas = new ListaSeqOrd();
	static ObjectFile arqContas = new ObjectFile("contas.dat");

	static void depositos() {
		Keyboard.clrscr();
		char resp;
		int numConta = Keyboard.readInt("Entrar com o numero da conta: ");
		ContaCorrente conta = new ContaCorrente(numConta);
		conta =(ContaCorrente) listaContas.retrieve(conta);
		if (conta == null) {		
			System.out.println("Conta inexistente");
			Keyboard.waitEnter();
		}
		else {
			do {
				float valor = Keyboard.readFloat("Entrar com o valor do deposito: ");
				String data = Keyboard.readData("Digite a data do deposito: ");
				conta.deposito(data,valor);
				resp = Keyboard.readChar("Outro deposito(s/n)");
			} while (resp == 's');
		}
	}

	static void saques() {
		Keyboard.clrscr();
		char resp = 's';
		int numConta = Keyboard.readInt("Entrar com o numero da conta: ");
		ContaCorrente conta = new ContaCorrente(numConta);
		conta = (ContaCorrente) listaContas.retrieve(conta);
		if (conta == null) { 
			System.out.println("Conta inexistente");
			Keyboard.waitEnter();
		}
		else {
			do {
				if (conta instanceof ContaEspecial){
					float valor = Keyboard.readFloat("Entrar com o valor do saque: ");
					
					if (valor > (conta.getSaldoFinal() + ((ContaEspecial)conta).getSaldoNegativo())){
						System.out.println("Valor acima do limite de credito.");	
						Keyboard.waitEnter();
					}
					else{
						String data = Keyboard.readData("Digite a data do saque: ");
						conta.saque(data,valor);
						resp = Keyboard.readChar("Outro saque(s/n)");
					}
				}
				else{						
					float valor = Keyboard.readFloat("Entrar com o valor do saque: ");
					if (valor > conta.getSaldoFinal()){
						System.out.println("Valor acima do saldo da conta.");
						Keyboard.waitEnter();						
					}
					else{
				String data = Keyboard.readData("Digite a data do saque: ");
				conta.saque(data,valor);
				resp = Keyboard.readChar("Outro saque(s/n)");
					}			
			} 
		}while (resp == 's');
		}
	}

	static void incluir() {
		char resp;		
		Keyboard.clrscr();
		do {			
			int numConta = Keyboard.readInt("Entrar com o numero da conta: ");
			ContaCorrente conta = new ContaCorrente(numConta);					
			if (listaContas.isThere(conta))  
				System.out.println("Conta ja existente");			
			else {
				String nomeCliente = Keyboard.readString("Entrar com o nome do cliente: ");
				float saldoInicial = Keyboard.readFloat("Digite o saldo inicial: ");
				char resp1 = Keyboard.readChar("A conta é Corrente, Poupança ou Especial (c/p/e)?");
			if (resp1 == 'c'){		
				ContaCorrente contac = new ContaCorrente(numConta,nomeCliente,saldoInicial);
				listaContas.insert((ContaCorrente)contac);						
			}
			else{
			if (resp1 == 'p'){
				ContaCorrente contap = new ContaPoupanca(numConta,nomeCliente,saldoInicial); 
				listaContas.insert((ContaPoupanca)contap);				
			}
			else{
				float saldoNegativo = Keyboard.readFloat("Digite o limite de credito: ");
				ContaCorrente contae = new ContaEspecial(numConta,nomeCliente,saldoInicial,saldoNegativo); 
				listaContas.insert((ContaEspecial)contae);				
			}		
			}
			}
			resp = Keyboard.readChar("Outra conta(s/n) ");
		} while (resp == 's');

	}	

	static void listar() {
		Keyboard.clrscr();
		System.out.println("N Conta  Nome do Cliente                 Tipo       Saldo");
		System.out.println("-------  ------------------------------  --    ----------");
		ContaCorrente conta = (ContaCorrente) listaContas.getFirst();		
		while (conta != null){ {
			System.out.printf("%7d  %-30s  ", conta.getNumConta(),conta.getNomeCliente());
			if (conta instanceof ContaPoupanca){
				System.out.printf("P");
				System.out.printf("  %10.2f\n",conta.getSaldoFinal());	
			}
			else{
				if (conta instanceof ContaEspecial){
					System.out.printf("E");
					System.out.printf("  %10.2f\n",conta.getSaldoFinal());	
				}
				else{
					System.out.printf("C");
					System.out.printf("  %10.2f\n",conta.getSaldoFinal());	
				}
			}
			conta = (ContaCorrente) listaContas.getNext();
		}
		}
		Keyboard.waitEnter();
	}

	static void gravarObjetos() { 
		arqContas.rewrite();   
		ContaCorrente conta = (ContaCorrente) listaContas.getFirst();
		while (conta != null){
			arqContas.write(conta);
			conta = (ContaCorrente) listaContas.getNext();
		}
		arqContas.closeFile();
	}

	static void lerObjetos() {
		arqContas.reset();	
		ContaCorrente conta = (ContaCorrente) arqContas.read();		
		while (conta != null) {		
			listaContas.insert(conta);
			conta = (ContaCorrente) arqContas.read();			
		}
		arqContas.closeFile();
	}
	
	static void imprimirExtrato(){
		int numConta = Keyboard.readInt("Entrar com o numero da conta: ");
		ContaCorrente conta = new ContaCorrente(numConta);
		conta = (ContaCorrente) listaContas.retrieve(conta);
		if (conta == null) {
			System.out.println("Conta inexistente");
			Keyboard.waitEnter();
		}
		else {
			if (conta instanceof ContaEspecial){
				conta.imprimirExtrato("Conta Especial");
				Keyboard.waitEnter();
			}
			else{
				if(conta instanceof ContaPoupanca){
					conta.imprimirExtrato("Conta Poupança");
					Keyboard.waitEnter();
				}
				else{
					conta.imprimirExtrato("Conta Corrente");
					Keyboard.waitEnter();
				}
			}			
		}
		
	}

	static void creditarRendimentos(){
		int numConta = Keyboard.readInt("Entrar com o numero da conta: ");
		ContaCorrente conta = new ContaCorrente(numConta);
		conta = (ContaCorrente) listaContas.retrieve(conta);
		if (conta == null) {
			System.out.println("Conta inexistente");
			Keyboard.waitEnter();
		}
		else {
			if (conta instanceof ContaPoupanca){			
				String data = Keyboard.readData("Digite a data do movimento:");
				float taxa = Keyboard.readFloat("Digite a taxa de juros: ");
			((ContaPoupanca)conta).creditaRendimentos(data, taxa);			
			Keyboard.waitEnter();
			}
			else{
				System.out.println("Esta conta nao é poupança.");
				Keyboard.waitEnter();
			}
				
		}
		
	}
	public static void main(String[] args) {
		int opcao;
		lerObjetos();
		do {
			Keyboard.clrscr();
			opcao = Keyboard.menu("Incluir Contas/Efetuar depositos/Efetuar saques/Extrato/Listar Contas/Creditar Rendimentos/Terminar");
			switch (opcao) {
				case 1:
					incluir();
					break;
				case 2:
					depositos();
					break;
				case 3:
					saques();
					break;
				case 4:
					imprimirExtrato();
					break;
				case 5:
					listar();
					break;
				case 6: 
					creditarRendimentos();					
			}
		} while (opcao < 7);

		gravarObjetos();
		System.out.println("\nFim do programa");
	}

}
import java.io.Serializable;


public class ListaSeq<E> implements Serializable {

	private E[] lista;
	private int numElementos;
	private int incremento;
	private int corrente;
	
	public ListaSeq(){
		   numElementos = 0;
		   incremento = 10;
		   lista = (E[]) new Object[10];
		}
	public ListaSeq(int tamanhoInicial){
		   numElementos = 0;
		   incremento = 10;
		   lista =(E[]) new Object[tamanhoInicial];
		}
	public ListaSeq(int tamanhoInicial,int incremento){
			numElementos = 0;
			this.incremento = incremento;
			lista = (E[]) new Object[tamanhoInicial];
		}
	protected void redimensione(){
		   if (numElementos == lista.length){
		      Object[] novoVetor = new Object[numElementos +
		                                      incremento];
		      System.arraycopy(lista, 0, novoVetor, 0, numElementos);
		      lista =(E[]) novoVetor;
		   }
		}
	protected int findPosition(Comparable<E> obj){
		   for (int i = 0; i < numElementos; i++) {
		      if (obj.compareTo(lista[i]) == 0)
		         return i;
		   }
		   return -1;
		}
	public void insert(E obj){
		   redimensione();
		   lista[numElementos] = obj;
		   numElementos++;
		}
	public boolean delete(Comparable<E> obj){
		   int posicao = findPosition(obj);
		   if (posicao >= 0){
		      for (int i = posicao; i < (numElementos-1); i++) {
		         lista[i] = lista[i+1];
		      }
		      numElementos--;
		      lista[numElementos] = null;
		      return true;
		   }
		   return false;
		}
	public boolean isThere(Comparable<E> obj){
		   return (findPosition(obj) >= 0);
		}
	public E retrieve(Comparable<E> obj){
		   int posicao = findPosition(obj);
		   if (posicao >= 0)
		      return lista[posicao];
		   else
		      return null;
		}
	public int length(){
		   return numElementos;
		}
	public Object getFirst(){
		   if (numElementos == 0)
		      return null;
		   else{
		      corrente = 0;
		      return lista[0];
		   }
		}
	public Object getNext(){
		   if (corrente == numElementos-1)
		      return null;
		   else
		      return lista[++corrente];
		}
	
}
import java.io.Serializable;


public class ListaSeqOrd<E> extends ListaSeq implements Serializable {
	private E[] lista;
	private int numElementos;
	public ListaSeqOrd() {
		
	}

	public ListaSeqOrd(int tamanhoInicial) {
		super(tamanhoInicial);
		
	}

	public ListaSeqOrd(int tamanhoInicial, int incremento) {
		super(tamanhoInicial, incremento);
		
	}
	
	public void insert(Comparable obj){
		   redimensione();
		   int posicao = findPositionInsert(obj);
		   numElementos++;
		   for (int i = numElementos - 1; i > posicao; i--) {
		      lista[i] = lista[i-1];
		   }
		   lista[posicao] = obj;
		}

	private int findPositionInsert(Comparable obj){
		   int inicio, fim, meio, c;
		   inicio = 0;
		   fim    = numElementos-1;
		   while (inicio <= fim){
		      meio = (inicio + fim)/2;
		      c = obj.CompareTo(lista[meio]);
		      if (c > 0)
		         inicio = meio + 1;
		      else
		         fim = meio - 1;
		   }
		   return inicio;
		}
	public void delete(Comparable obj){
		   int posicao = findPosition(obj);
		   if (posicao >= 0){
		      for (int i = posicao; i < (numElementos-1); i++) {
		         lista[i] = lista[i+1];
		      }
		      numElementos--;
		      lista[numElementos] = null;
		   }
		}
}

Já estou me sentindo um inuil.

sergiolopes

Não li o código todo, mas já vi que quando voce instancia a ListaSeqOrd voce não está usando generics:

static ListaSeqOrd listaContas = new ListaSeqOrd();

Mas se você vai usar generics na declaracao da classe, use na hora de dar new tambem:

static ListaSeqOrd<ContaCorrente> listaContas = new ListaSeqOrd<ContaCorrente>();

ou então tire o generics de tudo e tente fazer primeiro sem generics.
generics eh um topico BEM complicado

[]'s

F

Já testei sem o comparable, e esta tudo certo.

Usei também na hora de dar o new, mas na hora de atribuir o obj a lista ainda esta dando: Type mismatch: cannot convert from Comparable to E

F

Desculpa abusar, até eu já estou sem paciencia…

F

Help!

B

Você declarou o array como um array de Comparable?

F

Na verdade como ele esta herdando, nem tenho que declarar estava fazendo besteira…

sergiolopes

Bom, vamos tentar corrigir os problemas. Primeiro, a classe ContaCorrente está usando a ListaSeq sem generics. Mude a declaracao do atributo para (aproveita e coloca o private):

private ListaSeq<Movimento> listaMovimentos = new ListaSeq<Movimento>();

Isso mata a necessidade de casting (Movimento) dentro do imprimirExtrato. Coloca um getListaMovimentos na ContaCorrente para que a ContaPoupanca possa acessar:

ListaSeq<Movimento> getListaMovimentos() {
		return listaMovimentos;
	}

Na ListaSeq, mude os metodos getFirst e getNext para retornar E ao invés de Object:

public E getFirst(){
             // ..
	}
	public E getNext(){
            // ..
	}

O método findPosition la ListaSeq deveria receber E e não Comparable<E>. Na hora de procurar o elemento, ao invés de usar compareTo(…)==0 use o método equals:

protected int findPosition(E obj){
		   for (int i = 0; i < numElementos; i++) {
		      if (obj.equals(lista[i]))
		         return i;
		   }
		   return -1;
		}

Por isso é uma boa ter o método equals bonitinho na classe ContaCorrente. E é bom ter o hashcode lá também:

@Override
	public boolean equals(Object obj) {
		if (obj instanceof ContaCorrente)
			return this.compareTo((ContaCorrente)obj) == 0;
		return false;
	}
	
	@Override
	public int hashCode() {
		return this.numConta;
	}

Os metodos delete, isThere e retrieve de ListaSeq devem receber E e não Comparable<E>.

A definicao da classe ListaSeqOrd deve ser generica tambem e levar em consideracao o Comparable na declaracao:

public class ListaSeqOrd<E extends Comparable><? super E>> extends ListaSeq<E> implements Serializable {

Os métodos insert, findPositionInsert e delete em ListaSeqOrd devem receber E e não Comparable. Ah, e o delete em ListaSeqOrd deve devolver boolean por causa da herança:

@Override
	public boolean delete(E obj){
		   int posicao = findPosition(obj);
		   if (posicao >= 0){
		      for (int i = posicao; i < (numElementos-1); i++) {
		         lista[i] = lista[i+1];
		      }
		      numElementos--;
		      lista[numElementos] = null;
		      return true;
		   }
		   return false;
		}

Agora a classe Demo. Defina a listaContas com generics:

static ListaSeqOrd<ContaCorrente> listaContas = new ListaSeqOrd<ContaCorrente>();

Aí os metodos depositos, saques, listar, gravarObjetos, lerObjetos, imprimirExtrato em Demo não precisam mais do casting (ContaCorrente).
Não precisa tambem dos castings no metodo incluir, quando voce chama listaContas.insert(…)

To anexando as mudancas que fiz aqui…

[]'s

sergiolopes

Bom, as dicas acima já fazem seu código compilar corretamente, mas há várias melhorias possíveis. Por exemplo, coloque o método toString nas classes ContaCorrente/Especial/Poupanca devolvendo a String bonita pro extrato:

@Override
	public String toString() {
		return "Conta Corrente";
	}

(faça o mesmo nas outras)

Na classe ContaCorrente, mude o imprimirExtrato para chamar o toString() e retire o parametro:

public void imprimirExtrato() {
		Keyboard.clrscr();
		
		System.out.println("Número da conta: " + numConta);
		System.out.println("Nome do cliente: " + nomeCliente);
		System.out.println("Tipo da conta: " + toString());
		System.out.println("Data Mov      Valor     Tipo Mov  Saldo");
		System.out.println("------------  --------  --------  --------");
		saldoParcial = saldoInicial;
		Movimento movimento = listaMovimentos.getFirst();
		while (movimento != null){
			if (movimento.getTipoMov() == ('C')){
					saldoParcial = saldoParcial + movimento.getValor();						
			}
			else{
				saldoParcial = saldoParcial - movimento.getValor();					
			}			
			System.out.printf("%11s  %8.2f %6s %10.2f\n", movimento.getData(),movimento.getValor(),movimento.getTipoMov(),saldoParcial);	
			movimento =(Movimento) listaMovimentos.getNext();
			}
	}

Aí na classe Demo você pode mudar o método imprimirExtrato para algo bem mais simples:

static void imprimirExtrato(){
		int numConta = Keyboard.readInt("Entrar com o numero da conta: ");
		ContaCorrente conta = new ContaCorrente(numConta);
		conta = listaContas.retrieve(conta);

		if (conta == null) {
			System.out.println("Conta inexistente");
		} else {
			conta.imprimirExtrato();
		}
		Keyboard.waitEnter();
	}

Outra melhoria: faça um método getCodigo() na classe ContaCorrente devolvendo “C”, um na ContaPoupanca devolvendo “P” e um na ContaEspecial com “E”. Tipo:

public String getCodigo() {
		return "C";
	}

Aí você muda o método listar em Demo para algo tambem mais simples:

static void listar() {
		Keyboard.clrscr();
		System.out.println("N Conta  Nome do Cliente                 Tipo       Saldo");
		System.out.println("-------  ------------------------------  --    ----------");
		ContaCorrente conta = (ContaCorrente) listaContas.getFirst();		
		while (conta != null){
			System.out.printf("%7d  %-30s  ", conta.getNumConta(),conta.getNomeCliente());
			System.out.printf(conta.getCodigo());
			System.out.printf("  %10.2f\n",conta.getSaldoFinal());	
			conta = listaContas.getNext();
		}
		Keyboard.waitEnter();
	}

Há várias outras dicas possíveis mas você vai aprendendo com o tempo…
Aprenda a valorizar mais o polimorfismo (evite if/else com instanceof), evite usar tanto static, encapsule mais e crie classes menores…

F

De verdade eu não sei nem como agradecer a disponibilidade.

Mas explicando brevemente, eu sou estudante de CC, e não tinha programado em java ainda, por isso essas limitações quanto a linguagem, outra coisa é que isso é da materia de estrutura de dados, então eu fico meio limitado na parte de programação em si, porque junta a minha falta de conhecimento do java com o professor dando a estrutura e não programação.

Sergio Lopes, não é atoa que é moderador do forum…

O codigo agora esta sem rros, mas na hora que eu vouinserir uma conta aontece o seguinte:

Exception in thread main java.lang.NullPointerException

at ListaSeqOrd.insert(ListaSeqOrd.java:33)

at Demo.incluir(Demo.java:82)

at Demo.main(Demo.java:180)

Já estou sem graça de ficar aqui pedindo ajuda. :stuck_out_tongue:

sergiolopes

Uma dica pra você é tentar ver um pouco de Java também, é bem divertido. A Caelum tem apostilas de java boas para download, é um bom começo.

E sobre a exception: acabei de perceber que a classe ListaSeqOrd redeclara o array E[] lista. Remova a declaração na classe ListaSeqOrd e coloque a lista como protected na classe ListaSeq. Deve resolver…

F

Logo no primeiro periodo de faculdade eu tive uma palestra com um cara da caelum, e achei massa, entrei no site e fiquei abismado com o curriculum da galera, por muito pouco não fui passar uns 15 dias em SP pra fazer um curso, mas me faltou tempo, alem de tudo alguns professores me desencorajaram, por eu não saber que area eu vou seguir…

agora esta dando esse erro:

Exception in thread main java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable;

at ListaSeqOrd.insert(ListaSeqOrd.java:32)

at Demo.incluir(Demo.java:82)

at Demo.main(Demo.java:180)
F

Outra coisa, eu estava tentando aprender com as dicas que voc"e deu, mas tem uma coisa que eu n’ao entendi

tem como descrever o que eh cada coisa aqui

public class ListaSeqOrd<E extends Comparable<? super E>> extends ListaSeq<E> implements Serializable {
sergiolopes

Então esse erro que tá dando é por causa do generics com arrays por causa da herança, tem uns detalhes a mais bem complicados. (se tirasse a herança e o array E[] fosse redeclarado nas duas classes, resolveria)

E a declaração do generics lá em cima é BEM complicada e avançada. Basicamente o que ela diz é que o tipo E deve implementar Comparable dele com algum super tipo dele mesmo. Mas é algo mega avançado, que não cai nem nas certificações e que o pessoal de Java só entende de verdade depois de alguns anos apanhando.

Pela sua descrição da situação (estudar ED e não Java) eu recomendaria tentar pegar generics agora. Tem muito chão pela frente antes de entender direito como ele funciona.

F

O meu unico problema [e que o prof. disse que tem que usar heranca…

sergiolopes

Fiz uma “gambiarrinha” no código pra evitar o problema da herança. Veja o novo método createArray:

import java.io.Serializable;


@SuppressWarnings("serial")
public class ListaSeq<E> implements Serializable {

	protected E[] lista;
	private int numElementos;
	private int incremento;
	private int corrente;
	
	public ListaSeq(){
		   numElementos = 0;
		   incremento = 10;
		   lista = createArray(10);
		}
	
	public ListaSeq(int tamanhoInicial){
		   numElementos = 0;
		   incremento = 10;
		   lista = createArray(tamanhoInicial);
		}
	
	public ListaSeq(int tamanhoInicial,int incremento){
			numElementos = 0;
			this.incremento = incremento;
			lista = createArray(tamanhoInicial);
		}
	
	protected void redimensione(){
		   if (numElementos == lista.length){
		      E[] novoVetor =createArray(numElementos + incremento);
		      System.arraycopy(lista, 0, novoVetor, 0, numElementos);
		      lista = novoVetor;
		   }
		}
	
	@SuppressWarnings("unchecked")
	protected E[] createArray(int size) {
		return (E[]) new Object[size];
	}
	
	protected int findPosition(E obj){
		   for (int i = 0; i < numElementos; i++) {
		      if (obj.equals(lista[i]))
		         return i;
		   }
		   return -1;
		}
	public void insert(E obj){
		   redimensione();
		   lista[numElementos] = obj;
		   numElementos++;
		}
	public boolean delete(E obj){
		   int posicao = findPosition(obj);
		   if (posicao >= 0){
		      for (int i = posicao; i < (numElementos-1); i++) {
		         lista[i] = lista[i+1];
		      }
		      numElementos--;
		      lista[numElementos] = null;
		      return true;
		   }
		   return false;
		}
	public boolean isThere(E obj){
		   return (findPosition(obj) >= 0);
		}
	public E retrieve(E obj){
		   int posicao = findPosition(obj);
		   if (posicao >= 0)
		      return lista[posicao];
		   else
		      return null;
		}
	public int length(){
		   return numElementos;
		}
	public E getFirst(){
		   if (numElementos == 0)
		      return null;
		   else{
		      corrente = 0;
		      return lista[0];
		   }
		}
	public E getNext(){
		   if (corrente == numElementos-1)
		      return null;
		   else
		      return lista[++corrente];
		}
	
}

e

import java.io.Serializable;


@SuppressWarnings("serial")
public class ListaSeqOrd<E extends Comparable<? super E>> extends ListaSeq<E> implements Serializable {
	
	private int numElementos;
	
	public ListaSeqOrd() {
		super();
	}

	public ListaSeqOrd(int tamanhoInicial) {
		super(tamanhoInicial);
	}

	public ListaSeqOrd(int tamanhoInicial, int incremento) {
		super(tamanhoInicial, incremento);
	}
	
	@Override
	@SuppressWarnings("unchecked")
	protected E[] createArray(int size) {
		return (E[]) new Comparable[size];
	}
	
	public void insert(E obj){
		   redimensione();
		   int posicao = findPositionInsert(obj);
		   numElementos++;
		   for (int i = numElementos - 1; i > posicao; i--) {
		      lista[i] = lista[i-1];
		   }
		   lista[posicao] = obj;
		}

	private int findPositionInsert(E obj){
		   int inicio, fim, meio, c;
		   inicio = 0;
		   fim    = numElementos-1;
		   while (inicio <= fim){
		      meio = (inicio + fim)/2;
		      c = obj.compareTo(lista[meio]);
		      if (c > 0)
		         inicio = meio + 1;
		      else
		         fim = meio - 1;
		   }
		   return inicio;
		}
	
	@Override
	public boolean delete(E obj){
		   int posicao = findPosition(obj);
		   if (posicao >= 0){
		      for (int i = posicao; i < (numElementos-1); i++) {
		         lista[i] = lista[i+1];
		      }
		      numElementos--;
		      lista[numElementos] = null;
		      return true;
		   }
		   return false;
		}
}

E pra entender porque precisa na filha dar new Comparable[] e não new Object[] precisaríamos a funda em generics e falar de type erasure.

F

Eu to quase desitindo e esperando a resposta do prof. so nao fiz isso ainda porque vale ponto mas apareceu esse erro agora…

Exception in thread main java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable;

at ListaSeqOrd.insert(ListaSeqOrd.java:33)

at Demo.incluirCurso(Demo.java:21)

at Demo.main(Demo.java:61)
sergiolopes

o ultimo codigo que eu mandei corrige justamente esse problema

F

Opa, desculpa [e que eu n’ao coloquei o codigo todo…

Valew mesmo, sei nem como agradecer, vou dar uma estudada pesada nisso, apesar do professor ter me mandado um e-mail agora dizendo que nao aceita porque nao foi isso que ele pediu!

Criado 17 de setembro de 2009
Ultima resposta 18 de set. de 2009
Respostas 23
Participantes 4