Pourquoi ne fonctionne pas TreeSet.contains ()?
-
29-09-2019 - |
Question
public class Empty {
public static void main( String[] args ) {
TreeSet<Class> classes = new TreeSet<Class>();
classes.add( String.class );
String test = new String();
try{
if( classes.contains(test.getClass()) ){
System.out.println( "contains" );
}
}catch(ClassCastException cce){
System.out.println( "Expected: " + classes );
System.out.println( "But it was: " + test.getClass() );
}
}
}
Pourquoi cette jeter un ClassCastException
?
La solution
Lors de l'instanciation TreeSet
sans comparateur explicite, il attend inséré des éléments à mettre en œuvre Comparable
, mais Class
ne met pas en œuvre cette interface.
Pour résoudre, créez un comparateur pour Class
:
Comparator<Class> classComp = new Comparator<Class>()
{
@Override
public int compare(Class o1, Class o2)
{
return o1.getName().compareTo(o2.getName());
}
};
TreeSet<Class> classes = new TreeSet<Class>(classComp);
Autres conseils
TreeSet
est un ensemble ordonné, de sorte que tout élément que vous devez insérer mettre en œuvre Comparable
(sauf si vous spécifiez un Comparator
personnalisé). Class
ne fonctionne pas.
Si vous n'avez pas besoin de la commande, vous pouvez toujours utiliser un ensemble non ordonné tel que HashSet . Dans le cas contraire, vous devrez trouver une commande de votre propre.
De la Javadoc (Souligné par l'auteur):
Une mise en œuvre basée sur NavigableSet un TreeMap. Les éléments sont ordonnés en utilisant leur ordre naturel, ou par un A fourni à la création Comparator ensemble temps , selon le constructeur est utilisé.
Cette mise en œuvre fournit coût du temps garanti log (n) pour la les opérations de base (ajouter, supprimer et contient).
Notez que l'ordre maintenu par une ensemble (ou non explicite comparateur est prévu) doit être compatible avec égaux si elle est à mettre en œuvre correctement l'interface Set. (Voir Comparable ou pour une Comparator définition précise compatible avec est égal à.) Il en est ainsi parce que l'ensemble l'interface est définie en termes de la équivaut à l'opération, mais un TreeSet exemple exécute toutes élément les comparaisons à l'aide de son compareTo (ou comparer les) méthode, de sorte que les deux éléments sont réputés égaux par cette méthode sont, du point de vue de l'ensemble, égale. Le comportement d'un ensemble est bien défini même si sa commande est incompatible avec égaux; il ne suffit d'obéir à la contrat général de l'ensemble d'interface.
Blockquote Pourquoi cette jeter un ClassCastException?
Il a été causé par la mise en œuvre de TreeMap, le TreeSet qui est un ensemble clé de TreeMap repose sur elle.
java.lang.Class ne met pas en oeuvre l'interface java.lang.Comparable, donc il lèvera une exception de ClassCastException.
L'erreur réelle est java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.Comparable
. Ici, il est - TreeSet impose un ordre sur les éléments. Si vous utilisez un HashSet, tout est OK.