Fórum Erro em tempo de execução - Collections Java #601107
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
Gostei + 0
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
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)