Domanda

Sembra che getAnnotatedParameterTypes() restituisca una serie di AnnotatedTypes che tiene i tipi grezzi, piuttosto che generici.Ad esempio:

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());
}
.

Qual è il motivo per il disaccordo con getGenericParameterTypes()?

È stato utile?

Soluzione

C'è un Bug Seption su questo , e da allora è stato risolto.

C'è una differenza tra Method#getGenericParameterTypes() e Method#getAnnotatedParameterTypes().

Il primo fa garanzie sui tipi restituisce

.

Se un tipo di parametro formale è un tipo parametrizzato, il tipo oggetto restituito per questo deve riflettere con precisione i parametri del tipo effettivo usato nel codice sorgente.

Se un tipo di parametro formale è una variabile di tipo o un tipo parametrizzato, È stato creato. Altrimenti, è risolto.

Mentre il secondo non è, non chiaramente almeno:

.

Restituisce una serie di oggetti AnnotatedType che rappresentano l'uso di tipi per specificare i tipi di parametro formale del metodo / costruttore rappresentato da questo Executable.

Dobbiamo supporre che getAnnotatedParameterTypes() restituisce i tipi cancellati (anche se potrebbe non essere stato inteso in questo modo). La generazione di generazione variabile di tipo illimitata viene cancellata a T. Se hai generatodicetagcode, sarebbe stato cancellato a Object.

Per quanto riguarda i commenti, per ottenere l'annotazione da un argomento di tipo in un parametro metodo, non c'è modo di fornire quanto sopra. Ci vorrebbe che funzioni come fa per i campi.

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;
.

Quale stampe

class java.lang.String
[@com.example.Example$Bar()]
.

Penso molto che sia un bug che ha bisogno di fissaggio e seguirà il seguente rapporto sul bug collegato sopra.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top