Método int compareTo() da interface Comparable?

Estou estudando Collection na apostila da caelum na qual possui a seguinte pergunta…

O que aconteceria se uma classe qualquer não implementasse Comparable mas
tivesse o método compareTo?

Ocorre erro no métodos státic Colletions.sort(). Eu não consegui compreender o motivo do erro.

Seria pelo motivo de que compareTo() faz parte do contrato de Comparable e quando sort() invoca compareTo() não encontrará o método? Mas se eu tiver um método com o mesmo nome na minha classe concreta? não poderia chama-lo se ocorrer erro?

public static <T extends Comparable<? super T>> void sort(List<T> list)Esta é a declaração do método Collections.sort. Por isso que ele só aceita List de um tipo que implemente Comparable.

Se você não implementar Comparable, você pode criar um método chamado compareTo, mas não é obrigado. Receber uma referência de Comparable é a forma de garantir que o método sort poderá invocar internamente o método compareTo. Além de poder chamá-la pela própria referência passada sem precisar fazer um cast (polimorfismo).

Java não tem “duck typing*” (ou seja, SE uma classe tem um método int compareTo, ENTÃO ela implementa a interface Comparable).

Em Java, SE uma classe implementa a interface Comparable, ENTÃO ela tem um método int compareTo.

Note a lógica.

  • Duck typing : tradução literal (não recomendada) = “tipagem pato”, ou seja, se algo nada como um pato, grasna como um pato, voa como um pato, então é um pato.

sorry pessoal, mas ainda não compreendi direito… :shock:

O método sort espera alguém que implemente Comparable e não alguém que tenha o método compareTo. O exercício quer mostrar que, em Java, por termos tipagem forte e estática, o que vale na hora de ver o que compila e o que não compila é o tipo do objeto, e não necessariamente os métodos que ele tem.

A regra é que ter o método compareTo é uma consequência de se implementar Comparable e não simplesmente ter o método do nada. E o que o sort quer é que você passe alguém que implemente a interface. Só assim ele vai garantir que o método compareTo está implementado