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?

Était-ce utile?

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.

Voir aussi: Comparator

  

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top