Duvida ao usar a interface Comparable em classes abstratas

Tenho uma classe abstrata Account que implementa a interface Comparable:

public abstract class Account implements Comparable<Account>

Nesta classe implementei o metodo compareTo, de forma nao abstrata da seguinte maneira:

[code]public int CompareTo(Account account){
if(this.getBalance() < account.getBalance()){
return -1;
}

	if(this.getBalance() > account.getBalance()){
		return 1;
	}
	
	return 0;

}[/code]

A classe Account possui uma classe filha, nao abstrata chamada PersonalAccount.

public class SavingAccount extends Account

O que nao entendendo é que apos ter implementado a interface Comparable e o metodo CompareTo na classe mae Account, comecei a ter um erro na classe filha PersonalAccount obrigando a mesma implementar o metodo CompareTo tambem.

Alguem poderia me ajudar a entender por favor. Muito obrigado!

public abstract class Account implements Comparable<? extends Account>

poem assim

? extends Account

ou seja… é comparavel a qualquer coisa que extenda Account

Você pode colocar a mensagem de erro? Estranho, pq ela não deveria estar aparecendo.

Esquece. O problema é que o método chama-se compareTo não CompareTo. O "c" da palavra compare é minúsculo.

Para evitar esse tipo de problema, use o annotation @Override. Isso fará com que o compilador verifique se o método que você declarou está mesmo fazendo override de um método de uma classe ou interface, e apresente um erro caso não esteja. No seu caso, você acabou declarando um novo método, por isso ele exigia que você declarasse o método da interface (compareTo com “c” minúsculo) na classe filha.

@Override public int compareTo(Account account){ if(this.getBalance() < account.getBalance()){ return -1; } if(this.getBalance() > account.getBalance()){ return 1; } return 0; }

Uma forma mais simples de implementar esse mesmo método é:

@Override public int compareTo(Account account){ return this.getBalance() - account.getBalance(); }

Nossa, era mesmo um erro de sintaxe. Muito obrigado ViniGodoy.
E obrigado tambem Lavieri, porque usando da forma como falou o codigo ficara muito mais reutilizavel.

A forma que o Lavieri falou é aplicada em outro contexto.

Quando você tem uma List<? extends Account>, significa que você pode aceitar como parâmetro um List<Account> ou um List<SavingAccount>. Da mesma forma, você poderia ter um método setComparator na sua classe Account para trocar o comparador default que aceitasse um Comparator<? super Account>. Assim, alguém poderia fornecer para sua classe um outro Comparator<Account> ou um Comparator<Object>.

No caso de métodos, um compareTo(Account) já aceitará naturalmente um Account ou um SavingAccount, justamente por suportar polimorfismo. Por isso, não é necessário (e nem recomendado) usar os wildcards.

[quote=ViniGodoy]A forma que o Lavieri falou é aplicada em outro contexto.

Quando você tem uma List<? extends Account>, significa que você pode aceitar como parâmetro um List<Account> ou um List<SavingAccount>. Da mesma forma, você poderia ter um método setComparator na sua classe Account para trocar o comparador default que aceitasse um Comparator<? super Account>. Assim, alguém poderia fornecer para sua classe um outro Comparator<Account> ou um Comparator<Object>.

No caso de métodos, um compareTo(Account) já aceitará naturalmente um Account ou um SavingAccount, justamente por suportar polimorfismo. Por isso, não é necessário (e nem recomendado) usar os wildcards.[/quote]

justamente…

é que li rapidamente… e os Comparators (e não os Comparables) são normalmente tipados desta foram…

nesse caso ai não há necessidade dessa tipologia…

era o @Override mesmo ^^ q ajudaria mesmo a não cair nesse problema

[quote=HotBoyRZ]Tenho uma classe abstrata Account que implementa a interface Comparable:
[/quote]

Não é totalmente correto fazer isso. Comparable deve ser implementado na classe filha, não na classe pai.
Antigamente não tinha problema tecnico com esse erro, o compilador aceitava. Mas hoje ele não aceita e com razão.

Vc pode definir o método na classe abstrata que aceita qq tipo de conta, mas Comparable deve ser colocado na classe filha.