Existen otros usos para la jerarquía de interfaz Tipo que solo la API de reflexión. Por ejemplo, una biblioteca de generación de código puede definir implementaciones personalizadas. El JDK 8 en sí tiene 3 implementaciones diferentes de WildcardType. Si ParameterizedType.getRawType() devolvió una instancia de clase, entonces necesitaría poder crear una instancia de clase siempre que lo desee.
Una clase es un tipo muy arraigado en la JVM que tiene enlaces a la memoria administrada nativamente. Para crear una instancia de Clase, debe tener el código de bytes que define la clase. Pero en el caso de una biblioteca de generación de código, el código de bytes aún no existe. Si hubieran exigido que ParameterizedType devolviera una clase, limitaría la aplicabilidad de la jerarquía de la interfaz Tipo solo a la API de reflexión.
Esto puede no parecer un gran problema, pero tampoco es un elenco.
ParameterizedType.getOwnerType() devuelve un tipo ya que puede ser una clase u otro tipo parametrizado. Puede que, en teoría, devolver un TypeVariable, ya que el siguiente es válido de Java:
<M extends Map<?,?>> M.Entry<?,?> first(M map) { ... }
Sin embargo, es compilado como una referencia estática para el borrado de la variable tipo, en este caso M.Entry se compila como Map.Entry. En lugar de TypeVariable, una llamada a getOwnerType() desde la API de reflexión será una clase, al menos de acuerdo con mis pruebas.
Este hilo http://www.velocityreviews.com/forums/t524488-raw-type-other-than-a-class-possible.html indica que el tipo de devolución es siempre una clase, pero también estoy buscando más opiniones sobre esto. –
Parece una separación básica de interfaz e implementación para mí. El Javadoc lista 'Class' como la única implementación de' Type', pero el JRE contiene un par de docenas de clases protegidas que implementan 'Type' también. – skaffman
Compraría la separación de la interfaz frente al argumento de implementación si 'Type' no fuera una interfaz de marcador. Para hacer las cosas que me gustaría hacer con un 'Tipo', debo probar si es una 'Clase >', 'ParameterizedType',' WildcardType', 'GenericArrayType', y tal. Si pudiera lograr lo que quería con un objeto arbitrario solo como un 'Tipo', no me importaría mucho si la clase de tiempo de ejecución del resultado era 'java.lang.Class', o lo que sea. – pholser