Получение экземпляра класса универсального интерфейса, включая параметры типа

#java #generics #reflection

#java #общие сведения #отражение

Вопрос:

Допустим, у меня есть интерфейс GenericInterface

 interface GenericInterface<T> {
    T get();
}
  

Теперь, например, если я хочу получить объект класса типа Class<GenericInterface<String>> , например, так:

 public class Main {
    public static void main(String[] args) {
        Class<GenericInterface<String>> aClass = ...
    }
}
  

как бы я это сделал? GenericInterface<String>.class не работает и GenericInterface.class возвращает только a Class<GenericInterface> без параметра типа. Class.forName("GenericInterface<java.lang.String>") также просто выдает ClassNotFoundException . Возможно ли вообще получить такой объект?

Комментарии:

1. Смотрите здесь токены супертипа

Ответ №1:

С одной стороны, из-за стирания типов нет точного представления для параметризованных классов. В принципе, GenericInterface<String>.class это будет то же GenericInterface<Long>.class самое, что и .

С другой стороны, если вам действительно нужен такой класс по какой-либо причине, все еще есть (уродливый) способ получить его с помощью двойного приведения:

 @SuppressWarnings("unchecked")
Class<GenericInterface<String>> cls = (Class<GenericInterface<String>>)(Object)GenericInterface.class;
  

Комментарии:

1. Это также возможно с помощью одного приведения: @SuppressWarnings({"unchecked", "rawtypes"}) Class<GenericInterface<String>> cls = (Class)GenericInterface.class; Следует использовать с осторожностью.