Genéricos permitem escrever classes, interfaces e métodos que funcionam com um parâmetro de tipo especificado pelo chamador — fornecendo segurança de tipo em tempo de compilação e eliminando conversões de tipo (casts). Eles alimentam o Collections Framework e bibliotecas reutilizáveis.
O problema que genéricos resolvem
();
list.add();
list.add();
(String) list.get();
List<String> list = <>();
list.add();
list.add();
list.get();
