Come ottenere informazioni di tipo generico da GetaNotataParametertypes () in Java 8?
-
21-12-2019 - |
Domanda
Sembra che getAnnotatedParameterTypes()
restituisca una serie di AnnotatedType
s 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()
?
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 questoExecutable
.
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.