When you use <? extends MyClass>, the specific class replacing the generic must pass the is-a MyClass test. In your specific case, String is-a String. Since String can't be subclassed, the list in question must always be a list of String. So technically it's legal java, just really bad coding style.