¿Por qué T está limitado por Object en la firma Collections.max ()?

Acabo de pasar por la implementación de la clase java.util.Collections de Java 7 y vi algo que no entiendo. En la firma de función max , ¿por qué T está limitado por Object ?

 public static <T extends Object & Comparable> T max(Collection coll) { Iterator i = coll.iterator(); T candidate = i.next(); while (i.hasNext()) { T next = i.next(); if (next.compareTo(candidate) > 0) candidate = next; } return candidate; } 

max parece funcionar bien si se omite el Objeto enlazado.

 public static <T extends Comparable> T max(Collection coll) { Iterator i = coll.iterator(); T candidate = i.next(); while (i.hasNext()) { T next = i.next(); if (next.compareTo(candidate) > 0) candidate = next; } return candidate; } 

¿Hay realmente alguna situación donde el límite hace la diferencia? En caso afirmativo, proporcione un ejemplo concreto.

Los dos tienen los mismos límites, pero hay una diferencia sutil.

  > 

Esto hará que T convierta en un Object bajo borrado.

  > 

Esto hará que T vuelva Comparable en el borrado.


En este caso, se hace porque .max es anterior a Java 5. Podemos ver en este enlace que Joachim amablemente proporcionó que la firma de .max en Java 1.4.2 sea:

 public static Object max(Collection coll) 

Si hubiéramos usado > > como límite, nuestra firma sería

 public static Comparable max(Collection coll) 

Lo cual rompería las API. Me las he arreglado para encontrar esta página que trata la conversión de antiguas API a genéricas y da .max como un ejemplo específico.

Aquí explican por qué max se define de esta manera:

También debe asegurarse de que la API revisada conserve la compatibilidad binaria con clientes antiguos. Esto implica que el borrado de la API debe ser el mismo que el de la API original no regenerada. En la mayoría de los casos, esto cae naturalmente, pero hay algunos casos sutiles. Examinaremos uno de los casos más sutiles que hemos encontrado, el método Collections.max() . Como vimos en la sección Más diversión con comodines, una firma plausible para max() es:

public static > T max(Collection coll) public static > T max(Collection coll) Esto está bien, excepto que la eliminación de esta firma es: public static Comparable max(Collection coll) que es diferente de la firma original de max (): public static Object max(Collection coll)

Uno ciertamente podría haber especificado esta firma para max (), pero no fue hecha, y todos los viejos archivos de clase binarios que llaman Collections.max () dependen de una firma que devuelve Object.