2010-07-02 8 views
5

Ho un problema di litte e mi chiedevo come risolverlo. Ho una classe generica Tuple<A,B> e adesso vorrei ordinare loro tuple in base alla A e B. Si dovrebbe essere simile a questo:Assicurarsi che gli oggetti implementino Comparable

Celebrita:

 
(1,5) 
(2,8) 
(6,8) 
(1,4) 
(2,4) 

Ordinati:

 
(1,4) 
(1,5) 
(2,4) 
(2,8) 
(6,8) 

Per Per questo motivo ho pensato di implementare un metodo di confronto generico (public int compareTo(Tuple<A, B> other)) nella classe Tuple. L'unico problema è che tutti gli oggetti per cui è possibile parametrizzare la classe (ad esempio A = Integer, B = String) devono implementare anche il metodo compareTo affinché tutto funzioni.

C'è un modo per garantire che tutti gli oggetti che la tupla può contenere implementino l'interfaccia comparabile?

Oppure ci sono altri suggerimenti su come risolvere questo problema?

Grazie

risposta

5

Si potrebbe utilizzare tipo limiti ricorsive (vedi anche il punto 27 della Effective Java) per specificare che i componenti della tupla estendono paragonabile, in questo modo:

public class Tuple<A extends Comparable<? super A>, B extends Comparable<? super A>> implements Comparable<Tuple<A, B>> { 
    A valueA; 
    B valueB; 

    @Override 
    public int compareTo(Tuple<A, B> tuple) { 
     // Implement comparison logic 
     return 0; 
    } 
} 

Ciò consente di specificare i tipi differenti per i componenti di la tupla (Tuple < Integer, String >).

+0

Preferisco "A estensibile Comparabile ", ma +1 per l'implementazione Comparabile sulla stessa Tupla. Avrei dovuto ricordarmelo. –

+0

Ah, grazie. Ho modificato la mia risposta in modo da non indurre in errore e ho svalutato la versione di mmyers. – Lyle

1

Questo dovrebbe fare il trucco. Qualsiasi classe specificata dovrà estendere Comparabile.

public class Tuple<? extends Comparable> { 
} 
+0

Mi rendo conto che hai scritto questo senza vedere la dichiarazione generica originale di Tuple, quindi non posso biasimarti per aver perso i parametri A e B. Ma anche così, causerà un avvertimento perché non hai parametrizzato Comparabile. –

7

Se si dichiara la classe come

public class Tuple<A extends Comparable<? super A>, 
        B extends Comparable<? super B>> { ... 

allora che assicura che sia A che B sono auto-comparabili. Puoi quindi chiamare compareTo() su qualsiasi oggetto di tipo A o B che hai nella classe.

Problemi correlati