Using a wildcard as a return type implicitly means that the return value should be considered read-only, but without any way to enforce this contract.

Let's take the example of method returning a "List<? extends Animal>". Is it possible on this list to add a Dog, a Cat, ... we simply don't know. The consumer of a method should not have to deal with such disruptive questions.

Noncompliant Code Example

List<? extends Animal> getAnimals(){...}