Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida com a Classe TestaOrdenacao (Atividade 5 - Aula 5 do Java III)

Olá! O Eclipse estava acusando uns erros estranhos no meu código, e ao fazer a atividade 5, apareceu um erro inesperado. Aqui está meu código da classe Conta:

import br.com.alura.java.exception.ValorInvalidoException;

public abstract class Conta implements Comparable<Conta>{
    protected double saldo;
    private int numero;
    private String nomeCliente;

    public Conta(double saldo) {
        this.saldo = saldo;
    }

    @Override
    public boolean equals(Object obj) {
        Conta outraConta = (Conta) obj;
        return this.numero == outraConta.numero && this.nomeCliente.equals(outraConta.nomeCliente);
    }

    public int getNumero() {
        return numero;
    }

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

    @Override
    public String toString() {
        return "esse objeto é uma conta com saldo R$" + this.saldo;
    }

    public double getSaldo() {
        return saldo;
    }

    public void deposita(double valor) {
        if(valor <= 0) {
            throw new ValorInvalidoException(valor);
        }
        this.saldo += valor;
    }

    public void saca(double valor) {
        this.saldo -= valor;
    }

    public abstract void atualiza(double taxa);

    public int compareTo(Conta outra) {
        if (this.saldo > outra.saldo) return 1;
        if (this.saldo < outra.saldo) return -1;
        return 0;
    };
}

Classe ContaCorrente (não coloquei "implements Comparable<ContaCorrente>", aí tudo compila):

public class ContaCorrente extends Conta implements Tributavel {

    public ContaCorrente(double saldo) {
        super(saldo);
    }

    public void atualiza(double taxa) {
        this.saldo += this.saldo * taxa * 2;
    }

    @Override
    public double calculaTributos() {
        return this.getSaldo() * 0.01;
    }

    @Override
    public int compareTo(Conta outra) {
        if (this.saldo > outra.saldo) return 1;
        if (this.saldo < outra.saldo) return -1;
        return 0;
    }
}

Classe ContaPoupanca (Coloquei o Comparable, aí aparece "The interface Comparable cannot be implemented more than once with different arguments: Comparable<Conta> and Comparable<ContaPoupanca>"):

public class ContaPoupanca extends Conta implements Comparable<ContaPoupanca>{

    public ContaPoupanca(double saldo) {
        super(saldo);
    }

    public void atualiza(double taxa) {
        this.saldo += this.saldo * taxa * 3;
    }

    public void deposita(double valor) {
        this.saldo += valor - 0.10;
    }

    public int compareTo(ContaPoupanca outra) {
        if (this.saldo > outra.saldo) return 1;
        if (this.saldo < outra.saldo) return -1;
        return 0;
    }
}

Classe TestaOrdenacao (Compila normalmente):

public class TestaOrdenacao {
    public static void main(String[] args) {
        ContaPoupanca cp0 = new ContaPoupanca(100.0);
        ContaPoupanca cp1 = new ContaPoupanca(50.0);
        ContaPoupanca cp2 = new ContaPoupanca(75.0);
        ContaPoupanca cp3 = new ContaPoupanca(125.0);

        List<ContaPoupanca> contas = new ArrayList<ContaPoupanca>();
        contas.add(cp0);
        contas.add(cp1);
        contas.add(cp2);
        contas.add(cp3);

        Collections.sort(contas);

        for (ContaPoupanca c : contas) {
            System.out.println(c);
        }
    }
}

A minha dúvida fica pq o exercício diz "Faça um teste: remova temporariamente a sentença implements Comparable, não remova o método compareTo e veja o que acontece. Basta ter o método, sem assinar a interface?" com a resposta "Não basta! A interface é como um contrato e sem "assiná-lo" a existência do método é só uma coincidência e não dá a certeza para a JVM de que a intenção era mesmo assinar aquele contrato." Porém, se eu coloco Comparable, dá erro, e se eu não coloco, compila! Alguém sabe onde eu errei?

2 respostas
solução!

Não é preciso e nem é possível a classe ContaPoupanca implementar Comparable<ContaPoupanca>.

Não é preciso porque ela herda de Conta, logo já possui o método compareTo. Veja que ContaPoupanca já uma conta, logo, como classe filha, tem todos os seus métodos públicos.

E não é possível porque a classe Conta implementa "Comparable" com o tipo genérico Conta. Se a classe ContaPoupanca implementasse "Comparable" com o tipo genérico ContaPoupanca, como o compilador saberia de qual classe invocar o método "compareTo" (já que ambos os tipos genéricos são um Conta?).

Obrigado, Thiago.

Tinha pensado nisso, mas não conseguia entender o motivo. Esclareceu minhas ideias. Não respondi antes pois fiquei fora por um tempo, mas agora posso continuar os estudos, valeu!