Isso surgiu como uma pergunta que fiz em uma entrevista recentemente, como algo que o candidato gostaria de ver adicionado à linguagem Java. É comumente identificado como uma dor que o Java não reificou os genéricos , mas, quando pressionado, o candidato não poderia realmente me dizer o tipo de coisas que ele poderia ter alcançado se eles estivessem lá.
Obviamente, como os tipos brutos são permitidos em Java (e verificações inseguras), é possível subverter os genéricos e acabar com um List<Integer>
que (por exemplo) realmente contém String
s. Isso claramente poderia se tornar impossível se as informações de tipo fossem reificadas; mas deve haver mais do que isso !
As pessoas poderiam postar exemplos de coisas que realmente gostariam de fazer , se houvesse genéricos reificados disponíveis? Quero dizer, obviamente você poderia obter o tipo de a List
em tempo de execução - mas o que você faria com ele?
public <T> void foo(List<T> l) {
if (l.getGenericType() == Integer.class) {
//yeah baby! err, what now?
EDITAR : Uma atualização rápida para isso, pois as respostas parecem estar principalmente preocupadas com a necessidade de passar um Class
como um parâmetro (por exemplo EnumSet.noneOf(TimeUnit.class)
). Eu estava procurando mais por algo onde isso simplesmente não fosse possível . Por exemplo:
List<?> l1 = api.gimmeAList();
List<?> l2 = api.gimmeAnotherList();
if (l1.getGenericType().isAssignableFrom(l2.getGenericType())) {
l1.addAll(l2); //why on earth would I be doing this anyway?
findClass()
teria que ignorar a parametrização, mas defineClass()
não poderia). E como sabemos, The Powers That Be considera a compatibilidade com versões anteriores primordial.