El mnemónico de Josh Bloch PECS es útil aquí. Se significa:
Productor extends
, Consumer super
Esto significa que cuando un tipo parametrizado se pasa a un método se producir casos de T
(que serán recuperados de él de alguna manera), ? extends T
debe ser utilizado, ya que cualquier instancia de una subclase de T
también es T
.
Cuando se pasa un tipo parametrizado a un método consumir casos de T
(que serán pasados a él para hacer algo), ? super T
deben utilizarse porque una instancia de T
legalmente se puede pasar a cualquier método que acepta algún supertipo de T
. Un Comparator<Number>
podría usarse en un Collection<Integer>
, por ejemplo. ? extends T
no funcionaría, porque Comparator<Integer>
no podría funcionar en Collection<Number>
.
Editar: Para aclarar un poco más en get/put (producto/consumen):
public T something();
^
El anterior es un método que produce T
.
public void something(T t);
^
El anterior es un método que consume T
.
"Producer extends
, Consumer super
" se aplica a cómo se utilizará el objeto al que se está transfiriendo un objeto parametrizado. En el caso de Collections.max()
, los artículos se recuperarán del Collection
, por lo que es un productor. Esos elementos se pasarán como argumentos al método en Comparator
, por lo que es un consumidor.
Supongo que tal vez no entiendo completamente el principio get/put, entonces ... ??? –
Recomiendo leer el capítulo de Java efectivo que trata sobre "PECS", entonces. Y piénselo de esta manera: si le pedí que ordenara una lista de Dobles y le diera un Comparador para hacerlo, ¿cómo se sentiría al respecto? –
¿Podría ampliar su respuesta? Si bien la respuesta puede ser clara para los programadores avanzados de Java, es necesario releer la pregunta para comprender completamente lo que estás diciendo. Sé que esta podría ser una de sus respuestas anteriores, pero aparece en la sección de revisión de publicaciones de baja calidad. - [De la reseña] (https://stackoverflow.com/review/low-quality-posts/11445740) – Ferrybig