#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;
Следует использовать с осторожностью.