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
ContaCorrente
ContaPoupanca
Main
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
Curtir tópico
+ 0
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
Clique aqui para fazer login e interagir na Comunidade :)