2010-02-09 23 views
15

Quiero tener una interfaz A parametrizado por TA<T>, y también quieren cada clase que lo implementa para poner en práctica también Comparable (con T y sus subtipos). Parecería natural escribir interface A<T> extends Comparable<? extends T>, pero eso no funciona. ¿Cómo debería hacerlo entonces?interfaz Java extiende comparable

+1

También me gustaría hacer referencia a Java Generics FAQ (http://www.angelikalanger.com/GenericsFAQ/FAQSections/ProgrammingIdioms.html#FAQ204), el cual le dará más ideas con respecto a 'Comparable'. –

Respuesta

16

Cuando Comparable<? extends T> parece que significa que tiene una instancia de Comparable que se puede comparar a un subtipo (desconocido) de T, no es que se puede comparar con cualquier subtipo de T.

Pero usted don' Necesito eso, porque un Comparable<T> se puede comparar a cualquier subtipo de T de todos modos, por ejemplo un Comparable<Number> se puede comparar con un Comparable<Double>.

Así que trate de:

interface A<T> extends Comparable<T> { 
    // ... 
} 

o

interface A<T extends Comparable<T>> extends Comparable<A<T>> { 
    // ... 
} 

dependiendo de si tiene que ser capaz de comparar los casos de T con el fin de poner en práctica su método compareTo.

+0

¡Esta es una respuesta increíble! Vine aquí desde http://stackoverflow.com/questions/6290406/generic-method-to-sort-a-map-on-values. Resolvió mi problema –

2

Si utiliza comparable no es necesario especificar la posibilidad de subtipos en la función de comparación, es posible, por naturaleza, pasar cualquier subtipo de un objeto X a un método que declare un parámetro de la clase X. Consulte la código a continuación para más información.

public interface Test<T> extends Comparable<T> { 

} 

class TestImpl implements Test<Number> { 
    @Override 
    public int compareTo(final Number other) { 
     return other.intValue() - 128; 
    } 
} 

class TestMain { 
    public static void main(final String[] args) { 
     TestImpl testImpl = new TestImpl(); 
     testImpl.compareTo(Integer.MIN_VALUE); 
    } 
} 
Cuestiones relacionadas