Я использую оператор .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
дают и дают ошибку?
Почему upcast, а затем downcast с tListInt3
не выдает ошибку?
Есть ли лучший способ объявить tListInt3
?
С уважением,
Каспер ван ден Берг
пс. Дайте мне знать, если вы хотите увидеть код внешнего универсального контейнера, который нуждается в информации этого типа; я опубликую это если нужно.