Я использую .class -оператор для предоставления информации об содержащем типе универсальному классу. Для не-общих содержащихся типов, например. Integer.class, это работает без проблем. Но с включенным типом, являющимся общим, например. List<Integer>.class или List.class, это приводит к ошибкам компиляции времени в классе.
Есть способ обойти ошибки, но мне интересно, что здесь происходит. Может кто-нибудь объяснить, что происходит?, почему все так, как есть?, и что лучший способ обойти проблему?
Следующие строки демонстрируют проблему:
Обратите внимание, что внешний общий тип ожидает Class<T> в качестве параметра, поэтому в этом случае Class<List<Integer>>.
Class<Integer> tInt = Integer.class; // Works as expected.
Class<List> tList = List.class; // Works with warning, but is not
// what i'm looking for.
Class<List<Integer>> tListInt1 = List.class; // Error
Class<List<Integer>> tListInt2 = (Class<List<Integer>>) List.class; // Error
Class<List<?>> tListGeneric = (Class<List<Integer>>) List.class; // Error
Следующая строка работает:
Class<List<Integer>> tListInt3 =
(Class<List<Integer>>) ((Class<Integer>)List.class);
Почему декларации tListInt2 и tListGeneric дают и ошибки?
Почему угасание, а затем подавление с tListInt3 не приводит к ошибке?
Есть ли лучший способ объявить tListInt3?
С уважением,
Каспер ван ден Берг
пс. Сообщите мне, хотите ли вы видеть код внешнего универсального контейнера, который нуждается в информации этого типа; я отправлю его, если потребуется.