Pregunta

Parece getAnnotatedParameterTypes() devuelve una matriz de AnnotatedTypes 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()?

¿Fue útil?

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 este Executable.

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top