10
votes

Pourquoi je ne reçoive pas une exception de classe ou une autre chose en ajout d'un élément à l'arbreet

Le ci-dessous est mon code xxx

comme j'ai défini mon propre comparateur du numéro de type, mais toujours lorsque j'ajoute une autre chose qui est une chaîne à celle-ci, ça ne donne pas moi toute exception. Ça marche simplement bien. Je reçois la sortie comme xxx

peut-on expliquer pourquoi cela se produit.


1 commentaires

Juste hors de curiosité, quel est votre objectif réel ici? Un comparateur qui retourne toujours 1 est spectaculairement faux.


3 Réponses :


3
votes

A comparateur code> pour un arbreset code> est utilisé pour la commande et non pour lancer CCES. Étant donné que votre comparateur est conçu pour renvoyer 1 code> pour tout, cela signifie que la commande ne serait pas correcte.

C'est la raison pour laquelle votre sortie n'est pas commandée. P>

soit sûr de lire la documentation du constructeur de arbreset code>. p> xxx pré>

Il indique clairement que si vous essayez d'ajouter un autre élément autre que ceux de la Comparateur CODE> est conçu pour, il lancerait un classcastexception code>. Vous pouvez simuler cette si vous n'utilisez pas de génériques forts> en essayant d'ajouter une chaîne code>. Si vous utilisez des génériques, cependant, ce serait juste un problème d'heure de compilation. P>

Entre-temps, vous devez utiliser des génériques de manière cohérente. P>

class NumberComparator<C> implements Comparator<C> {
    public int compare(C o1, C o2) {
        return 1; // change this logic
    }
}

Set<Number> set = new TreeSet<>(new NumberComparator<Number>());


0 commentaires

17
votes

Le problème est un mélange de pratiques médiocres:

  • Vous utilisez le type brut pour arbreset code> li>
  • Votre NumberComeComParator code> est générique ( numéro code> est un paramètre de type) li> ul>

    Le fait que numéro code> est un paramètre de type ici signifie que le type effectif signifie que vous ne poserez pas réellement le type code> de type code>. p>

    Si vous modifiez votre comparateur en: p> xxx pré>

    et votre code d'appel sur: p> xxx pré>

    alors em> je m'attendrais à une exception. p>

    En outre, si vous modifiez votre code pour ne pas utiliser le type brut: p>

    TreeSet<Number> set = new TreeSet<Number>(new NumberComparator());
    


6 commentaires

Merci, je comprends, cela signifie que le nombre est de type (pas réellement java.lang.number) alors au moment de l'exécution, il est devenu java.lang.Object donc il n'y a pas d'exception de classe de classe.Mais pourquoi il est devenu type?. Toutefois une chose que je ne suis pas capable de digérer.


@ Krushanach.dash: qu'entendez-vous par "mais pourquoi il est devenu type?" ? Vous l'avez déclaré comme un paramètre de type dans NumberComeComParator.


Ohh, désolé mon erreur, j'ai maintenant


La mise en œuvre du comparateur est également très cassée et je pense que si elle avait en réalité utilisé les chiffres (par exemple, intvalue ), vous auriez probablement une exception à partir de cette.


@Kevinbourrillion: Le comparateur est définitivement brisé, oui - mais en utilisant les chiffres ne pose pas de problème. Vous ne pouvez pas appeler intvalue dans comparer car car numéro ne signifie pas java.lang.number - cela signifie le paramètre type Nombre .


Encore mieux, alors: Si vous écrivez un vrai comparateur au lieu d'un faux, vous auriez obtenu une erreur Compiler Erreur d'essayer de faire quoi que ce soit avec le numéro.



0
votes

Tout a tout dit, vous obtiendrez une exception de camping de classe si vous définissez votre comparateur comme ci-dessous :)

import java.util.Comparator;

class NumberComparator<Number> implements Comparator<java.lang.Number> {
public int compare(java.lang.Number o1, java.lang.Number o2) {


    return 1;
}
}


1 commentaires

Après cette modification, il ne sert à rien de faire paramétrer la classe, alors renommez-le à Just NumberComeComparator au lieu de NumberComeComParator .