extends
является верхней границей - это означает, что любой указанный экземпляр не должен быть "выше" в иерархии наследования, чем указанный тип.
В вашем примере ? extends Drink
- верхняя граница, поэтому каждый объект должен затем расширяться от Drink
, чтобы быть юридически назначенным в этот список.
super
является нижней границей - это означает, что любой указанный экземпляр не должен быть "более низким" в иерархии наследования, чем указанный тип.
Из вашего примера ? super Drink
является нижней границей, поэтому каждый объект должен быть либо типом Drink
, либо типом его предка - в данном случае Object
.
?
- это подстановочный знак - вы на самом деле не заботитесь , какой тип в коллекции, если вы его используете (поскольку вы не можете получить эту информацию обратно). По умолчанию это приводит к ? extends Object
, и, следовательно, применяются правила верхней границы (и выполняются).