Domanda

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() );
        }
    }
}

Perché questo gettare un ClassCastException?

È stato utile?

Soluzione

Quando istanziare TreeSet senza un comparatore esplicito, si aspetta elementi inserito per attuare Comparable, ma Class non implementa questa interfaccia.

Per risolvere, creare un comparatore per 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);

Altri suggerimenti

TreeSet è un insieme ordinato, in modo che qualsiasi elemento si inserisce necessario implementare Comparable (a meno che non si specifica un Comparator personalizzato). Class non lo fa.

Se non è necessario l'ordinamento, si può sempre usare un insieme non ordinato come HashSet . In caso contrario, sarà necessario venire con un ordinamento di tua scelta.

Dal Javadoc (sottolineatura mia):

  

Un'implementazione NavigableSet basa su   un TreeMap. Gli elementi sono ordinate   usando il loro ordinamento naturale, o da una   Comparatore fornito al momento della creazione insieme   tempo , a seconda di quale costruttore   viene utilizzato.

     

Questa implementazione fornisce   costo log (n) tempo garantito per il   operazioni di base (aggiungere, rimuovere e   contiene).

     

Si noti che l'ordine mantenuto da un   set (anche un esplicito   comparatore è previsto) deve essere   coerente con eguali se si tratta di   correttamente implementare l'interfaccia Set.   (Vedere comparabile o comparatore per un   precisa definizione di coerenti con   è uguale a.) Questo è così perché il set   interfaccia è definita in termini di   uguale operazione, ma un TreeSet   esempio esegue tutte dell'elemento   i confronti che utilizzano il suo compareTo (o   metodo compare), quindi due elementi che   sono considerati uguali con tale metodo,   dal punto di vista del set, uguale.   Il comportamento di un insieme è ben definita   anche se ordinamento è incoerente   con eguali; non riesce solo per obbedire   contratto generale dell'interfaccia Set.

Vedi anche: comparatore

  

Blockquote   Perché questo gettare un ClassCastException?

E 'stata la causa per l'attuazione della TreeMap, il TreeSet che è un insieme fondamentale di TreeMap è basata su di esso.

java.lang.Class non implementa l'interfaccia java.lang.Comparable, così sarà un'eccezione di ClassCastException.

L'errore effettivo è java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.Comparable . Qui è - TreeSet impone un ordinamento sugli elementi. Se si utilizza un HashSet, tutto è OK.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top