java - parameter - ¿Por qué T está limitado por Object en la firma Collections.max()?
java generics parameter (1)
Los dos tienen los mismos límites, pero hay una diferencia sutil.
<T extends Object & Comparable<? super T>>
Esto hará que T
convierta en un Object
bajo borrado.
<T extends Comparable<? super T>>
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 <T extends Comparable<? super T>>
<T extends Comparable<? super T>>
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 paramax()
es:
public static <T extends Comparable<? super T>> T max(Collection<T> coll)
public static <T extends Comparable<? super T>> T max(Collection<T> 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.
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<? super T>> T max(Collection<? extends T> coll) {
Iterator<? extends T> 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<? super T>> T max(Collection<? extends T> coll) {
Iterator<? extends T> 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.