Yo estaba buscando a través de los TheAlgorithms repositorio para java y llegaron a esta primera: https://github.com/TheAlgorithms/Java/blob/master/Searches/SearchAlgorithm.java . Veo <T extends Comparable<T>>
, y no sé lo que significa esta. Sólo sé un poco acerca de los genéricos y sé que la sintaxis tiene algo que ver con los límites del tipo de parámetro, pero sería genial si alguien pudiera aclarar la forma en que esto tiene que ver con Comparable<T>
, y lo que Comparable<T>
es.
Hay algunas otras preguntas en este foro similar a la mía ocupan de la aplicación <T extends Comparable<T>>
, pero las respuestas no han aclarado lo que realmente Comparable<T>
es.
En primer lugar, usted tiene la Comparable
interfaz que más o menos se parece a:
public interface Comparable<T> {
int compareTo(T other);
}
Como se puede ver, el parámetro de tipo de Comparable
se utiliza como parámetro del compareTo
método. Típicamente, el argumento de tipo para T
es de la misma clase que implementa el Comparable
interfaz. Esta configuración genérico facilita la comparación de casos del mismo tipo entre sí. He aquí un ejemplo:
public class Name implements Comparable<Name> {
@Override
public int compareTo(Name other) {
// compute & return result
}
}
Ahora digamos que usted tiene un método que debe devolver el máximo de dos objetos de acuerdo a su orden natural. Método A Tal podría ser similar a la siguiente:
public static <U extends Comparable<U>> U max(U left, U right) {
return left.compareTo(right) >= 0 ? left : right;
}
Nota: Se utiliza U
como variable de tipo en lugar de T
mostrarlo es independiente del T
utilizado en la Comparable
interfaz.
Lo anterior es un método genérico. La variable de tipo U
se superior delimitada por Comparable<U>
. Lo que esto significa es que el argumento de tipo utilizado en lugar de U
debe poder asignar (es decir subtipo de) Comparable<U>
. Por ejemplo, si se utiliza Name
como el argumento de tipo que funciona porque Name
es asignable a Comparable<Name>
. La razón para especificar el límite superior, como Comparable<U>
es que las necesidades método a llamar compareTo
con el fin de funcionar correctamente.
Name name1 = ...;
Name name2 = ...;
Name max = max(name1, name2); // U is inferred to be Name
Como se muestra arriba, que tiene U
como el tipo de retorno también permite asignar el resultado a una variable del mismo tipo que los argumentos.
Tenga en cuenta que para una máxima flexibilidad del max
método en realidad debería ser declarado como tal:
public static <U extends Comparable<? super U>> U max(U left, U right) {
return left.compareTo(right) >= 0 ? left : right;
}
La diferencia es la utilización de Comparable<? super U>
como el límite superior en lugar de Comparable<U>
. Estos dos Q & A deberían ayudar a explicar por qué el uso ? super U
ofrece una mayor flexibilidad: