Explicación del principio get-put

He leído el libro de O’Reilly, en lo que llegué a conocer este principio de ponerme en práctica .

  • Use un comodín de extends cuando solo obtiene valores de una estructura.
  • Use un super comodín cuando solo coloca valores en una estructura.
  • Y no use un comodín cuando ambos deseen obtener y colocar desde / hacia una estructura.

Las excepciones son:

  • No puede poner nada en un tipo declarado con un comodín extends excepto por el valor null , que pertenece a cada tipo de referencia.

  • No se puede obtener nada de un tipo declarado con un super comodín, excepto por un valor de tipo Object , que es un tipo estupendo de cada tipo de referencia.

¿Alguien puede ayudarme a explorar esta regla en profundidad? Si es posible, por favor póngalos de manera jerárquica.

Considera un montón de plátanos. Esta es una Collection Collection porque es una colección de un tipo particular de fruta, pero no sabes (de esa statement) de qué tipo de fruta es una colección. Puedes obtener un artículo de él y saber que definitivamente será una fruta, pero no puedes agregarlo , podrías estar tratando de agregar una manzana a un manojo de plátanos, lo que definitivamente sería incorrecto. Puede agregarle null , ya que será un valor válido para cualquier tipo de fruta.

Ahora considera un fruitbowl. Esta es una Collection Collection , en el sentido de que es una colección de algún tipo de Banana “mayor que” (por ejemplo, Collection o Collection ). Definitivamente, puedes agregarle un plátano, pero si sacas un objeto del cuenco, no sabes lo que vas a conseguir: puede que no sea ​​un plátano. Todo lo que usted sabe con certeza es que será una referencia de Object válida (posiblemente null ).

(En general, para preguntas sobre generics de Java, las Preguntas frecuentes sobre generics de Java son un excelente recurso que contiene la respuesta a casi cualquier cosa relacionada con generics que pueda arrojar sobre ella).