Eso es porque no lo estás sobreescribiendo correctamente, sino que lo estarás
"sobrecargando"
Me explico:
Ese método, para
sobreescribirlo, el dato de retorno y el argumento de entrada (lo que le llega entre paréntesis) han de ser exactamente los mismos que tiene en la clase/interface madre de la cuál proviene
En este caso concreto, el dato de retorno es un int y el argumento de entrada es un objeto Persona
Si yo cambiar alguno de esos datos, es perfectamente "legal"..., pero ya no estaría sobreescribiéndolo.
Estaría
sobrecargándolo, por ejemplo:
Sobrecargar significa que ahora habrían conviviendo dos métodos con exactamente el mismo nombre: compareTo()
Pero son distintos porque sus datos de retorno y/o argumento de entrada son diferentes.
Y hay ocasiones en las que nos puede interesar tener un método sobrecargado, de hecho, es algo habitual. Pero en este caso no nos sirve sobrecargar, necesitamos sobreescribir.
La función de la etiqueta @Override es precisamente comprobar si estamos sobreescribiendo o no.
Si no la ponemos, podríamos estar sobrecargando por error, en lugar de sobreescribir. Y no nos daríamos cuenta.
Pero al ponerla, ya no se permite sobrecargar. Solo va a permitir sobreescribir, siempre que lo hagamos bien claro. Por eso te salió error en la etiqueta @Override, porque algo debiste hacer mal y te avisaba de que NO estabas sobreescribiendo, si no sobrecargando.
Y sobrecargar no va a servir para que el ArrayList ordene, hay que sobreescribir.
Revisa como escribiste el código, o publícalo aquí para que lo revisemos.
Sobre todo comprueba como pusiste la implementación de la interfaz.
En mi código, puse específicamente que solo íbamos a comparar objetos Persona.
Al ponerlo así, el método compareTo() obligatoriamente ha de recibir un objeto Persona
Sin embargo, es muy habitual y lo verás en muchos sitios, que no se especifique la clase
final con la que se va a comparar y que se indique la clase Object, que es la superclase madre absoluta
Si por casualidad lo has puesto así, entonces el método compareTo() te va a exigir un argumento de entrada de clase Object para dejarse sobreescribir
Puede hacerse así, lo único es que luego en el código habrá que instanciar ese Object como Persona para poder hacer las comparaciones.
Pero en cualquier caso, los datos de retorno y entrada del método comparteTo() han de corresponderse con la manera que hayamos implementado la interface Comparable.
Un saludo.