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?