Olá pessoal,
Vejam o seguinte código, um rápido exemplo utilizando generics:
class Animal {}
class Gato extends Animal {}
public class GenericTest {
public static void main(String[] args) {
List<Gato> l = new ArrayList<Gato>();
workWithList(l);
}
private static void workWithList(List<? extends Animal> lst) {
lst.get(0); // OK
lst.add(new Gato()); // NAO COMPILA !
}
}
Até aí tudo bem, já entendi porque a segunda linha não compila, quais os inconvenientes que poderiam ocorrer.
Minha dúvida é a seguinte: como o compilador sabe que a primeira linha é “segura” e a segunda não? Afinal na declaração dos métodos (interface List) não há nada que indique isso:
// Interface List
E get(int index);
boolean add(E o);
Essa questão está me intrigando… E aí, é feitiçaria ou tecnologia? 
