Perché non TreeSet.contains) lavoro (?
-
29-09-2019 - |
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
?
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.