Erro em tempo de execução - Collections Java

Java

13/03/2019

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

Curtidas 0

Respostas

Joao Santos

Joao Santos

13/03/2019

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.
GOSTEI 0
Wendel Rios

Wendel Rios

13/03/2019

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.
GOSTEI 0
POSTAR