type - java generics bounded wildcards
La interfaz de Java se extiende Comparable (2)
Quiero tener una interfaz A
parametrizada por T
A<T>
, y también quiero que cada clase que la implementa también implemente Comparable
(con T
y sus subtipos). Parecería natural escribir la interface A<T> extends Comparable<? extends T>
interface A<T> extends Comparable<? extends T>
, pero eso no funciona. ¿Cómo debería hacerlo entonces?
Cuando Comparable<? extends T>
Comparable<? extends T>
aparece, significa que tienes una instancia de Comparable
que se puede comparar con un subtipo (desconocido) de T
, y no que se pueda comparar con ningún subtipo de T.
Pero no es necesario, porque una Comparable<T>
comparable puede compararse con cualquier subtipo de T
todos modos, por ejemplo, un Comparable<Number>
comparable puede compararse con un Comparable<Double>
.
Así que prueba:
interface A<T> extends Comparable<T> {
// ...
}
o
interface A<T extends Comparable<T>> extends Comparable<A<T>> {
// ...
}
dependiendo de si necesita o no poder comparar instancias de T
para implementar su método compareTo
.
Si usa comparable, no es necesario especificar la posibilidad de subtipos en la función de comparación, por naturaleza es posible pasar cualquier subtipo de un objeto X a un método que declare un parámetro de la clase X. Consulte el código a continuación para obtener más información. 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);
}
}