CompareTo è diverso da equals. Uno restituisce un intero che indica se un oggetto è minore di un altro secondo l'idea che ha il programmatore di minore. Equals verifica l'uguaglianza di due oggetti (sempre secondo l'idea che ne ha il programmatore) e restituisce un boolean.

Non puoi usare compareTo per confrontare due interi perchè il tipo intero è un tipo primitivo (non un oggetto).

Le alternative sono due:

* mantieni il tipo intero e fai i confronti tramite le sottrazioni
quindi usi (this.track-a.track)

* confronti due Integer con il metodo compareTo in questo modo:
(new Integer(this.track)).compareTo(new Integer(a.track))

Ricorda anche di controllare che l'oggetto o passato come parametro sia di tipo Song prima.