Существуют и другие применения иерархии интерфейса Type, кроме api отражения.Например, библиотека генерации кода может определять пользовательские реализации.Сам JDK 8 имеет 3 различных реализации WildcardType.Если ParameterizedType.getRawType () вернул экземпляр класса, тогда вам нужно будет создать экземпляр класса в любое время.
Класс - это глубоко укоренившийся тип JVM, имеющий привязки к памяти, управляемой собственными силами.Чтобы создать экземпляр класса, вы должны иметь байтовый код, который определяет класс.Но в случае библиотеки генерации кода, байт-код еще даже не существует.Если бы им потребовалось, чтобы ParameterizedType возвратил класс, это ограничило бы применимость иерархии интерфейса Type только отражением api.
Это может показаться не таким уж большим делом, но и не является приведением.
ParameterizedType.getOwnerType () возвращает тип, поскольку он сам может быть либо классом, либо другим параметром ParameterizedType.Теоретически он может возвращать TypeVariable, так как следующее является допустимым Java:
<M extends Map<?,?>> M.Entry<?,?> first(M map) { ... }
Однако он скомпилирован как статическая ссылка на стирание переменной типа, в этом случае M.Entry будет скомпилирован как Map.Вступление.Вместо TypeVariable вызов getOwnerType () из API-интерфейса отражения будет Class, по крайней мере, согласно моим тестам.