Here is the problem that I have been being tried to find the solution.
We have two class definitions. One of two extends other one.
class T{}
List extends T> indicates that anything can comes out of it can be cast to T, so the true list could be any of the following:
ListListListYou can see that even a new T cannot safely be added to such a collection because it could be a List which T cannot be put into. As such, such List cannot have non null entries added to them.
In this case you may simply want List
This contravariance can be useful for method parameters or returns, in which a collection will be read, rather than added to. A use for this could be to create a method that accepts any collection that holds items that are T, or extend T.
public static void processList(Collection extends Vector3d> list){
for(Vector3d vector:list){
//do something
}
}
This method could accept any collection of objects that extends Vector3d, so ArrayList would be acceptable.
Equally a method could return such a collection. An example of a use case is described in Returning a Collection