Cómo llegar de tipo genérico de información de getAnnotatedParameterTypes() en Java 8?
-
21-12-2019 - |
Pregunta
Parece getAnnotatedParameterTypes()
devuelve una matriz de AnnotatedType
s la celebración de crudo, en lugar de genéricos, tipos.Por ejemplo:
public <T> void genericMethod(T t) {
}
@Test
public void testAnnotatedTypes() throws ReflectiveOperationException {
Method method = getClass().getMethod("genericMethod", Object.class);
Type type = method.getGenericParameterTypes()[0];
assertTrue(type instanceof TypeVariable);
AnnotatedType annotatedType = method.getAnnotatedParameterTypes()[0];
// This fails; annotatedType implements only AnnotatedType
assertTrue(annotatedType instanceof AnnotatedTypeVariable);
// This fails too; type is a TypeVariable while annotatedType.getType() is
// Object.class
assertEquals(type, annotatedType.getType());
}
¿Cuál es la razón de su desacuerdo con getGenericParameterTypes()
?
Solución
Hay un informe de errores acerca de este, y desde entonces ha sido un fijo.
Hay una diferencia entre Method#getGenericParameterTypes()
y Method#getAnnotatedParameterTypes()
.
El primero hace que las garantías sobre los tipos devuelve
Si un parámetro formal de tipo de un tipo en parámetros, el Tipo de objeto devuelto por ello, debe reflejar todos los parámetros de tipo se utiliza en el código fuente.
Si un tipo de parámetro formal es una variable de tipo o de un tipo en parámetros, es creado.De lo contrario, se resuelve.
mientras que el segundo no, no claro, al menos:
Devuelve una matriz de
AnnotatedType
los objetos que representan el uso de tipos de especificar el parámetro formal de los tipos del método/constructor representado por esteExecutable
.
Tenemos que asumir que getAnnotatedParameterTypes()
devuelve el borrado (aunque puede que no haya sido la intención de que manera).La variable de tipo ilimitado T
es borrada Object
.Si había <T extends Foo>
, sería borrada Foo
.
Como por los comentarios, acerca de la introducción de la anotación de un tipo de argumento en un parámetro de método, no hay manera de que teniendo en cuenta lo anterior.Uno podría pensar que funciona como lo hace para los campos.
public static void main(String[] args) throws Exception {
Field field = Example.class.getField("field");
AnnotatedParameterizedType annotatedParameterizedType = (AnnotatedParameterizedType) field
.getAnnotatedType();
System.out.println(annotatedParameterizedType
.getAnnotatedActualTypeArguments()[0].getType());
System.out.println(Arrays.toString(annotatedParameterizedType
.getAnnotatedActualTypeArguments()[0].getAnnotations()));
}
@Retention(RetentionPolicy.RUNTIME)
@Target(value = { ElementType.TYPE_USE })
@interface Bar {
}
public List<@Bar String> field;
que imprime
class java.lang.String
[@com.example.Example$Bar()]
Yo creo que es un error que hay que arreglar y será a partir del informe de error vinculado anteriormente.