why the compiler can’t retain the assignment safe? It knows that,by executing for instance, the method with an Integer List, it gets from i.get an Integer value. So it try to set an Integer value at index 0 to the same Integer list (i).
Put differently, why does the compiler not know that the two usages of the wildcard type
refer to the same actual type?
Well, that would require the compiler to know that
i contains the same instance for both evaluations of the expression. Since
i isn’t even final, the compiler would have to check whether
i could possibly have been assigned in between evaluating the two expressions. Such an analysis is only simple for local variables (for who knows whether an invoked method will update a particular field of a particular object?). This is quite a bit of additional complexity in the compiler for rarely manifesting benefits. I suppose that’s why the designers of the Java programming language kept things simple by specifying that different uses of the same wildcard type have different captures.