1

I get the point that “? extends E” means is that it is ok to add all members of a collection with elements of any type that is a subtype of E. Hence for a List , addAll(all values of List) will hold good. But then why it is generalised that "Use an extends wildcard when you only get values out of a structure" as per The Get and Put Principle ?

Sara
  • 33
  • 1
  • 10
  • 1
    It has already been discussed thousands of times, e.g. here: http://stackoverflow.com/questions/2723397/what-is-pecs-producer-extends-consumer-super – Ivan Pronin Apr 06 '17 at 13:42
  • *“? extends E” means is that it is ok to add all members of a collection with elements of any type that is a subtype of E.* No, it doesn’t. It means it accepts elements of a specific subtype which may be E or may be a descendant of E. You cannot add Integers or Doubles to a `Collection extends Number>`, because it *might* be a `Collection` or it *might* be a `Collection` or it might be a `Collection`, etc. – VGR Apr 06 '17 at 14:11

1 Answers1

1

When you addAll from the parameter Collection, you're "getting" all the elements in the Collection parameter and adding them to another collection. Therefore "Producer Extends (Consumer Super)" still applies here.

By enforcing the generic <? extends E>, we are ensuring that all elements in the parameter are instanceof E, and can therefore be successfully added to a Collection<E>.

Zircon
  • 4,677
  • 15
  • 32
  • See also example source code for [`addAll`](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/AbstractCollection.java#AbstractCollection.addAll%28java.util.Collection%29) which could also elucidate the point. – Radiodef Apr 06 '17 at 13:44