2010-02-11 24 views
25

Entiendo get and put principle para colecciones: si un método toma una colección en la que escribirá un tipo T, el parámetro tiene que ser Collection<? super T>, mientras que si lee un tipo T de, el parámetro tiene que ser Collection<? extends T>.Genéricos de Java: Collections.max() firma y comparador

Pero podría alguien por favor explicar la Collections.max() firma:

public static <T> T max(Collection<? extends T> coll, 
        Comparator<? super T> comp) 

En particular, ¿por qué es Comparator<? super T> en lugar de Comparator<? extends T>?

Respuesta

65

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.

0

El comparador debe poder tomar un T como argumento.

+0

Supongo que tal vez no entiendo completamente el principio get/put, entonces ... ??? –

+6

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? –

+0

¿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

1

El comparador consume un par de Ts y produce un int. La colección produce los Ts que consume el comparador.

Super consume, extiende produce.

En relación con el principio get y put, get produce y pone consume.