Para obtener mejores resultados, debe usar public static <T extends Comparable<? super T>> T max(T a, T b)
.
El problema con <T extends Comparable<?>>
es que esto indica que el tipo T es comparable a algún tipo, pero no se sabe qué es ese tipo. Por supuesto, el sentido común dictaría que una clase que implementa Comparable debería ser capaz de ser comparable al menos a sí misma (es decir, ser capaz de comparar con objetos de su propio tipo), pero técnicamente no hay nada que impida que la clase A implemente Comparable<B>
, donde A y B no tienen nada que ver el uno con el otro. <T extends Comparable<T>>
resuelve este problema.
Pero hay un problema sutil con eso. Supongamos que la clase X implementa Comparable<X>
, y tengo una clase Y que se extiende X. Por lo tanto, la clase Y implementa automáticamente Comparable<X>
por herencia. La clase Y tampoco puede implementar Comparable<Y>
porque una clase no puede implementar una interfaz dos veces con diferentes parámetros de tipo. Esto no es realmente un problema, ya que las instancias de Y son instancias de X, entonces Y es comparable a todas las instancias de Y. Pero el problema es que no puede usar el tipo Y con su función <T extends Comparable<T>> T max(T a, T b)
, porque Y no implementa Comparable<Y>
. Los límites son muy estrictos.<T extends Comparable<? super T>>
soluciona el problema, porque es suficiente para que T sea comparable a algún supertipo de T (que incluiría todas las instancias T). Recordar la regla PECS - productor extends
, consumidor super
- en este caso, Comparable
es un consumidor (toma en un objeto para comparar), por lo que super
tiene sentido.
Este es el tipo de límites utilizados por todas las funciones de ordenamiento y clasificación en la biblioteca de Java.
En el bloque 'if (a == null)', no hay necesidad de la cláusula if anidada. Reducir el bloque a 'return b;' produce el mismo resultado ('null' cuando' b' es 'null',' b' en caso contrario). – benjamin
Ver [org.apache.commons.lang3.ObjectUtils.compare] (https://commons.apache.org/proper/commons-lang/javadocs/api-3.6/org/apache/commons/lang3/ObjectUtils.html# compare-TT-) –