drsmachado:
Try it:
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.List;
public class Test {
List<String> stringList = new ArrayList<String>();
List<Integer> integerList = new ArrayList<Integer>();
public static void main(String... args) throws Exception {
Field stringListField = Test.class.getDeclaredField("stringList");
ParameterizedType stringListType = (ParameterizedType) stringListField.getGenericType();
Class<?> stringListClass = (Class<?>) stringListType.getActualTypeArguments()[0];
System.out.println(stringListClass); // class java.lang.String.
Field integerListField = Test.class.getDeclaredField("integerList");
ParameterizedType integerListType = (ParameterizedType) integerListField.getGenericType();
Class<?> integerListClass = (Class<?>) integerListType.getActualTypeArguments()[0];
System.out.println(integerListClass); // class java.lang.Integer.
}
}
And tell us what`s the result…
Eu fiz um teste aqui e essa abordagem não resolve o problema:
1 - você só consegue fazer essa inferência a partir de variáveis de instância
2 - nem sempre o tipo retornado por getActualTypeArguments é uma classe. No caso, de declarar o seu Set como Set<? extends Historico> vai retornar um WildcardType.
Ou seja, mesmo essa solução só te permite obter tipos conhecidos em tempo de compilação, mas você não consegue obter o tipo passado como argumento na criação do HashSet.
Enfim, eu consideraria seriamente repensar esse design enquanto houver tempo, caso contrário, esse tipo de workaround vai se espalhar rapidamente pelo seu sistema.
Minha sugestão: o bom e velho composição a favor de herança. Por que ao invés de estender Historico, você não mantém uma única classe Historico com um campo de tipo e um campo objeto para receber tanto Aluno quanto Professor ? Ou então, você definitivamente separa HistoricoAluno e HistoricoProfessor, sem relação de herança entre elas …