2010-07-02 10 views
5

Tengo un pequeño problema y me preguntaba cómo solucionarlo. Tengo una clase genérica Tuple<A,B> y ahora me gustaría ordenar sus tuplas según A y B. Se debe tener este aspecto:Asegúrese de que los objetos implementen Comparable

Sin clasificar:

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

Ordenada:

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

Para esa razón pensé en implementar un método de comparación genérico (public int compareTo(Tuple<A, B> other)) en la clase Tuple. El único problema es que todos los objetos para los que se podría parametrizar la clase (por ejemplo, A = Entero, B = Cadena) también deben implementar el método compareTo para que todo funcione.

¿Hay alguna forma de garantizar que todos los objetos que Tuple puede contener implementen la interfaz Comparable?

¿O hay alguna otra sugerencia sobre cómo solucionar este problema?

Gracias

Respuesta

5

Usted podría utilizar límites de tipo recursivo (véase también el artículo 27 de Effective Java) para especificar que los componentes de la tupla se extienden comparable, así:

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

Esto le permite especificar diferentes tipos de los componentes de la tupla (Tuple < Entero, Cadena >).

+0

Prefiero 'A se extiende Comparable ', pero +1 para implementar Comparable en la propia Tuple. Deberia haber recordado eso. –

+0

Ah, gracias. He editado mi respuesta para no engañar, y he actualizado la versión de mmyers. – Lyle

1

Esto debe hacer el truco. Cualquier clase que especifique deberá extenderse Comparable.

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

Me doy cuenta de que escribió esto sin ver la declaración genérica original de Tuple, así que no puedo culparlo por perder los parámetros A y B. Pero aun así, provocará una advertencia porque no ha parametrizado Comparable. –

7

Si se declara la clase como

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

entonces que asegura que tanto A como B son auto-comparables. A continuación, puede llamar al compareTo() en cualquier objeto de tipo A o B que tenga en la clase.

Cuestiones relacionadas