Le ci-dessous est mon code 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 p> peut-on expliquer pourquoi cela se produit. P> p>
3 Réponses :
A C'est la raison pour laquelle votre sortie n'est pas commandée. P> soit sûr de lire la documentation du constructeur de Il indique clairement que si vous essayez d'ajouter un autre élément autre que ceux de la Entre-temps, vous devez utiliser des génériques de manière cohérente. P> 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.
arbreset code>. p>
Comparateur CODE> est conçu pour, il lancerait un
classcastexception code>. Vous pouvez simuler cette
code>. Si vous utilisez des génériques, cependant, ce serait juste un problème d'heure de compilation. 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>());
Le problème est un mélange de pratiques médiocres:
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());
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é i> les chiffres (par exemple, intvalue code>), 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 code> dans
comparer code> car car
numéro code> ne signifie pas java.lang.number - cela signifie le paramètre type
Nombre code>.
Encore mieux, alors: Si vous écrivez un vrai comparateur au lieu d'un faux, vous auriez obtenu une erreur Compiler i> Erreur d'essayer de faire quoi que ce soit avec le numéro.
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; } }
Après cette modification, il ne sert à rien de faire paramétrer la classe, alors renommez-le à Just NumberComeComparator Code> au lieu de
NumberComeComParator
Juste hors de curiosité, quel est votre objectif réel ici? Un comparateur qui retourne toujours 1 est spectaculairement faux.