2010-04-13 12 views
9

ad es. Il codice seguente genera una classe ClassCastException quando il secondo oggetto viene aggiunto a TreeSet. Impossibile che TreeSet sia stato scritto in modo che il parametro type possa essere solo di tipo Comparable? , ad esempio TreeSet non si compila perché l'oggetto non è paragonabile. In questo modo i generici fanno effettivamente il loro lavoro - di essere tipicamente.Perché TreeSet di Java non specifica che il parametro type deve essere esteso a Comparable?

import java.util.TreeSet; 
public class TreeSetTest { 
    public static void main(String [] args) { 
    TreeSet<Object> t = new TreeSet<Object>(); 
    t.add(new Object()); 
    t.add(new Object()); 
    } 
} 

risposta

4

Se il tipo deve essere comparabile, non è possibile creare un set di alberi con un tipo non confrontabile e un comparatore (che è possibile come è ora).

Un modo per risolvere questo problema pur essendo sicuro per il tipo sarebbe stato avere due classi: una con un parametro di tipo comparabile e una con un parametro di tipo non confrontabile e nessun costruttore predefinito (solo il costruttore che accetta un Comparatore), ma suppongo che gli sviluppatori java non volessero introdurre due classi che fondamentalmente facevano la stessa cosa (anche se si potrebbe facilmente essere implementate come un wrapper attorno all'altra).

Un altro (e probabilmente più pulito) sarebbe l'estensione del sistema di tipi in modo che alcuni costruttori esistano solo se usati con determinati parametri di tipo (cioè il costruttore predefinito esiste solo se il parametro type è comparabile), ma suppongo che hanno reso il sistema generico troppo complesso per java.

+0

Grazie per la risposta completa. Lol, penso che il sistema generico sia già abbastanza complicato! – Tarski

13

TreeSet non richiede il suo parametro tipo da Comparable, perché può prendere una esterna Comparator per il confronto non Comparable valori.

+0

Ah grazie. Suppongo che non ci sia modo di specificare una restrizione sul costruttore no-args in modo che possa assumere solo i Comparables? Sarebbe stato un progetto migliore avere due classi - una che accetta un parametro di tipo Comparable e uno che accetta qualsiasi parametro di tipo ma i costruttori devono prendere Comparators? – Tarski

+4

@Tarski: 'TreeSet' è stato aggiunto in 1.2. I generici sono stati aggiunti in 1.5. –

1

Questo perché il valore non deve necessariamente implementare Comparable. È possibile passare al set un oggetto Comparator esplicitamente, nel qual caso il tipo di elemento non deve essere un Comparable.

0

È inoltre possibile creare un TreeSet con un Comparator come parametro del costruttore. Quindi i tuoi articoli non devono essere comparabili.

Problemi correlati