My question is why objects with upper-bounded wildcard are immutable while objects with lower-bounded wildcards are not.
to illustrate this i will write some code
List<? super Exception> superException = new ArrayList<>();
superException.add(new Exception());
superException.add(new IOException());
superException.add(new FileNotFoundException());
List<? extends IOException> extendsException = new ArrayList<>();
extendsException.add(new Exception()); // DOES NOT COMPILE
extendsException.add(new IOException()); // DOES NOT COMPILE
extendsException.add(new FileNotFoundException()); // DOES NOT COMPILE