1
resposta

Erro ao tentar usar o método add de List

Ao tentar adicionar as contas a uma lista com

contas.add(c1);

dá erro, [The method add(ContaPoupanca) in the type List is not applicable for the arguments (Conta)] só consigo com:

contas.add((ContaPoupanca) c1);

segue código completo:

package br.com.felipe.banco.sistema;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import br.com.felipe.banco.conta.Conta;
import br.com.felipe.banco.conta.ContaPoupanca;
import br.com.felipe.banco.conta.ValorInvalidoException;

public class TestaOrdenacao {
    public static void main(String[] args) throws ValorInvalidoException {
        // TODO Auto-generated method stub
        Conta c1 = new ContaPoupanca(1);
        c1.deposita(300);
        Conta c2 = new ContaPoupanca(2);
        c2.deposita(100);
        Conta c3 = new ContaPoupanca(3);
        c3.deposita(500);
        Conta c4 = new ContaPoupanca(4);
        c4.deposita(50);

        List<ContaPoupanca> contas = new ArrayList<>();

        contas.add((ContaPoupanca) c1);
        contas.add((ContaPoupanca) c3);
        contas.add((ContaPoupanca) c2);
        contas.add((ContaPoupanca) c4);

        Collections.sort(contas);
        System.out.println(contas);
    }

}

Interface conta

package br.com.felipe.banco.conta;

public abstract class Conta {

    protected double saldo;
    protected int numero;
    private String titular;

    Conta(int numero){
        this.numero = numero;
    }

    public int getNumero() {
        return numero;
    }

    public void setNumero(int numero) {
        this.numero = numero;
    }

    public String toString(){

        return "Conta número: "+this.numero+"\n";
    }
}
1 resposta

Bom dia Felipe,

É assim mesmo, vamos entender o porque:

Quando você cria uma lista e diz que o tipo de dado que ela armazena é

List<ContaPoupanca>

o compilador deverá garantir que você não escreva nenhum código que de chance para que algo que não seja ContaPoupanca seja adicionado nessa lista.

Se você tenta adicionar um objeto que é instancia de ContaPoupanca, mas referência de Conta, o compilador não tem como garantir em tempo de compilação que aquela variável Conta conterá de fato uma instancia de ContaPoupanca em tempo de execução. Afinal, já que Conta é uma superclasse, pode ser que ao passar uma Conta, em tempo de execução pode ser qualquer outra instancia, como uma ContaCorrente. Por isso ele te força a fazer o cast, fazendo com que o desenvolvedor assuma a responsabilidade por garantir que em tempo de execução, aquilo será uma instancia de ContaPoupanca.

Se você definir a lista assim:

List<Conta>

ai sim poderá adicionar tanto objetos que sejam ContaCorrente ou ContaPoupanca, ou qualquer outra subclasse de Conta.

Considerando a parte do curso que você se encontra, acredito que foi apenas uma confusão, o objetivo ai é você fazer uso do Polimorfismo, logo a lista deve ser tipada como Conta mesmo, para assim aceitar objetos de qualquer uma de suas classes filhas.

Espero ter ajudado, abraço.