Erro em tempo de execução - Collections Java

13/03/2019

0

Eu tenho uma Interface Conta, e duas classes concretas "ContaCorrente" e "ContaPoupanca", e na minha classe main, eu crio um ArrayList onde eu adiciono tanto ContaCorrente como ContaPoupanca, e percorro essa colecao, pra chamar um metodo da interface q essas classes implementam. So que to tendo um erro em tempo de execucao, onde ta estourando uma ClassCastExeception, devido ao cast q eu faco dentro desse metodo em cada uma dessas classes concretas. Se eu tenho o metodo implementado nas duas classes pq ta estourando essa excecao?

Interface Conta
package testes.arrays;
import java.util.List;

public interface Conta {
	
	boolean sacar(double valor);
	
	void depositar(double valor);
	
	void transferirPara(Conta c, double valor);
	
	void emitirExtrato(Pessoa p);
	
	void emitirExtrato(List<Conta> c);
}


ContaCorrente
package testes.arrays;
import java.util.List;
import java.util.ArrayList;

public class ContaCorrente implements Conta{
	
	private String id;
	private double saldo;
	private double limite;
	private Pessoa titular;
	
	public ContaCorrente(String id, Pessoa titular) {
		this.saldo = 0;
		this.limite = 1000 + saldo;
		this.id = id;
		this.titular = titular;
	}
	
	public String getId() {
		return this.id;
	}
	
	public double getSaldo() {
		return this.saldo;
	}
	
	public void setSaldo(double saldo) {
		this.saldo = saldo;
	}
	
	public double getLimite() {
		return this.limite;
	}
	
	public Pessoa getTitular() {
		return this.titular;
	}
	
	public boolean sacar(double valor) {
		if((getSaldo()+getLimite())<valor) {
			System.out.println("Valor indisponivel para saque");
			return false;
		}else {
			setSaldo(getSaldo()-(valor*1.30));
			System.out.println("Saque realizado");
			return true;
		}
	}
	
	public void depositar(double valor) {
		if(valor<0) {
			throw new IllegalArgumentException("Argumento Invalido");
		}else {
			this.setSaldo(getSaldo()+valor);
		}
	}
	
	public void transferirPara(Conta c, double valor) {
		this.setSaldo(getSaldo()-valor);
		c.depositar(valor);
	}
	
	public void emitirExtrato(Pessoa p) {
		System.out.println("Nome: "+p.getNome());
		System.out.println("Id do Titular: "+p.getId());
		System.out.println("Id da Conta: "+this.getId());
		System.out.println("Saldo da conta: "+this.getSaldo());
		System.out.println("Limite da Conta: "+this.getLimite());
	}
	
	public void emitirExtrato(List<Conta> c) {
		for(int i=0;i<c.size();i++) {
			ContaCorrente cc = (ContaCorrente) c.get(i);
			System.out.println(cc.getTitular().toString());
			System.out.println(cc.getId());
			System.out.println(cc.getSaldo());
			System.out.println(cc.getLimite());
		}
	}
	
	@Override
	public boolean equals(Object obj) {
		if(obj == null) {
			throw new NullPointerException("Parametro nulo");
		}
		if(!(obj instanceof ContaCorrente)) {
			return false;
		}else {
			ContaCorrente c = (ContaCorrente) obj;
			return this.getId().equals(c.getId());
		}
	}
	
	
}


ContaPoupanca
package testes.arrays;

import java.util.List;

public class ContaPoupanca implements Conta{
	
	private String id;
	private double saldo;
	private double limite;
	private Pessoa titular;
	
	public ContaPoupanca(String id, Pessoa titular) {
		this.saldo = 0;
		this.limite = 1000 + saldo;
		this.id = id;
		this.titular = titular;
	}
	
	public String getId() {
		return id;
	}
	
	public double getSaldo() {
		return saldo;
	}
	
	public void setSaldo(double saldo) {
		this.saldo = saldo;
	}
	
	public double getLimite() {
		return limite;
	}
	
	public Pessoa getTitular() {
		return titular;
	}
	
	public boolean sacar(double valor) {
		if((getSaldo()+getLimite())<valor) {
			System.out.println("Valor indisponivel para saque");
			return false;
		}else {
			setSaldo(getSaldo()-valor);
			System.out.println("Saque realizado");
			return true;
		}
	}
	
	public void depositar(double valor) {
		if(valor<0) {
			throw new IllegalArgumentException("Argumento Invalido");
		}else {
			this.setSaldo(getSaldo()+valor);
		}
	}
	
	public void transferirPara(Conta c, double valor) {
		this.setSaldo(getSaldo()-valor);
		c.depositar(valor);
	}
	
	public void emitirExtrato(Pessoa p) {
		System.out.println("Nome: "+p.getNome());
		System.out.println("Id do Titular: "+p.getId());
		System.out.println("Id da Conta: "+this.getId());
		System.out.println("Saldo da conta: "+this.getSaldo());
		System.out.println("Limite da Conta: "+this.getLimite());
	}
	
	public void emitirExtrato(List<Conta> c) {
		for(int i=0;i<c.size();i++) {
			ContaPoupanca cc = (ContaPoupanca) c.get(i);
			System.out.println(cc.getTitular().getNome());
			System.out.println(cc.getTitular().getId());
			System.out.println(cc.getId());
			System.out.println(cc.getSaldo());
			System.out.println(cc.getLimite());
		}
	}
	
	
	@Override
	public boolean equals(Object obj) {
		if(obj == null) {
			throw new NullPointerException("Parametro nulo");
		}
		if(!(obj instanceof ContaCorrente)) {
			return false;
		}else {
			ContaCorrente c = (ContaCorrente) obj;
			return this.getId().equals(c.getId());
		}
	}
	
	public void rendimento(Conta c) {
		c.depositar(getSaldo()*0.50);
	}
}


Main
package testes.arrays;
import java.util.ArrayList;  
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Iterator;

public class Banco {
	
	public static void main(String[] args) {
		
		List<Conta> contas = new ArrayList();
		
		Pessoa p = new PessoaFisica("wendel","129");
		Conta a = new ContaPoupanca("123",p);
		
		Pessoa p2 = new PessoaFisica("maria","456");
		Conta b = new ContaCorrente("980",p2);
		
		Pessoa p3 = new PessoaFisica("jose","121");
		Conta cp = new ContaPoupanca("000",p3);
		
		contas.add(a);
		contas.add(b);
		contas.add(cp);
		
		for(Conta aux : contas) {
			aux.emitirExtrato(contas);
		}
		
		
	}
}
Wendel Rios

Wendel Rios

Responder

Posts

17/03/2019

Joao Santos

Simples, ContaCorrente.emitirExtrato(List<Conta>) você realiza um cast de todas as contas da lista para ContaCorrente contudo na lista informada ao método há também objetos do tipo ContaPoupanca que são de tipos diferentes, portanto o cast não pode ser executado, erro similar está presente no método ContaPoupanca.emitirExtrato(List<Conta>) no qual você realiza um cast de todas os objetos da lista para ContaPoupanca mas há alguns objetos ContaCorrente e que portanto irá gerar a exceção.
Responder

19/03/2019

Wendel Rios

Simples, ContaCorrente.emitirExtrato(List<Conta>) você realiza um cast de todas as contas da lista para ContaCorrente contudo na lista informada ao método há também objetos do tipo ContaPoupanca que são de tipos diferentes, portanto o cast não pode ser executado, erro similar está presente no método ContaPoupanca.emitirExtrato(List<Conta>) no qual você realiza um cast de todas os objetos da lista para ContaPoupanca mas há alguns objetos ContaCorrente e que portanto irá gerar a exceção.


Sim, por exemplo, se minha Lista comeca com contacorrente ele vai fazendo os casts, ate encontrar por exemplo uma contapoupanca (e estourar a excecao), o msm vale se comecar por contapoupanca. Eu achava q a JVM verificava objeto por objeto, se o objeto instanciado possuia o metodo, e ai decidia qual chamar em tempo de execucao.
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar