2
votes

Problèmes avec le remplacement de compareTo () dans l'interface Comparable

Je travaille sur un programme qui doit remplacer CompareTo () dans Comparable pour que Collections.sort () fonctionne. Car je travaille avec une ArrayList composée d'assistants, que je dois trier en fonction du nom.

J'ai parcouru le forum et j'ai trouvé cela et essayé de changer

    public int compareTo(Object o2){

à

    @Override
    public int compareTo(Object o2){
        Assistant m2 = (Assistant) o2;

        if(this.name.compareTo(m2.name) == 0){
            return 0;
        }else if(this.name.compareTo(m2.name)<0){
            return -1;
        }else{
            return 1;
        }
    }


qui en retour me permet d'utiliser Collections.sort () dans une autre classe et ne me prévient d'aucune erreur, cependant, deux nouvelles erreurs apparaître.

Pour commencer, dans cette même ligne

public class Assistant implements Comparable<Assistant>{

il me dit que "ce n'est pas abstrait et ne remplace pas compareTo (Assistant) dans Comparable. " Et quand je vais au compareTo (), j'ai créé:

public class Assistant implements Comparable<Assistant>{

(Le constructeur de l'assistant n'a qu'un nom).

Cependant, à cet endroit, j'ai une erreur dans @Override: "La méthode ne remplace ni n'implémente une méthode d'un supertype".

Et dans la ligne suivante

public class Assistant{

j'obtiens une autre erreur (qui est liée à la dernière) me disant: "Conflit de noms: compareTo (objet) dans l'Assistant et compareTo (Assistant) dans Assistant ont le même effacement, mais aucun des deux ne remplace l'autre."

Je comprends en quelque sorte le problème, je ne remplace pas le compareTo d'origine ().

Je suis un débutant en java, donc si quelqu'un trouve le problème, je vous serais reconnaissant si vous pouviez également expliquer ce que je fais mal (ou ce que je manque).

Merci :)


0 commentaires

4 Réponses :


1
votes

Puisque vous implémentez Comparable, votre méthode compareTo () nécessite un paramètre de type Assistent.

Donc, utiliser ceci devrait fonctionner:

@Override
public int compareTo(Assistent m2) {

    if(this.name.compareTo(m2.name) == 0){
        return 0;
    }else if(this.name.compareTo(m2.name)<0){
        return -1;
    }else{
        return 1;
    }
}


0 commentaires

5
votes

C'est parce que vous avez paramétré Comparable (le paramètre de type est Assistant ). Cela devrait le faire (je l'ai un peu simplifié):

@Override
public int compareTo(Assistant o){
    return this.name.compareTo(o.name);
}


0 commentaires

1
votes

Ceci parce que pour avoir Comparable de type Assistant

Changer

public int compareTo(Assistant o2)

En,

public int compareTo(Object o2)


0 commentaires

1
votes

Aux exemples déjà correctement indiqués sur la façon dont l'implémentation se compilerait, j'ajouterai quelques règles à retenir en ce qui concerne les méthodes de remplacement:

  1. Pour remplacer une méthode, vous devez utiliser le même nom de méthode,
  2. un type de retour covariant (rétrocompatible),
  3. type d'accès identique ou plus large, mais pas plus restreint
  4. Cependant, la liste des paramètres doit différer.

Le numéro 4 explique pourquoi vous devez changer le type de paramètre d'objet en assistant pour qu'il remplace avec succès la méthode compareTo ().


0 commentaires