2017-08-26 2 views
0

Je veux utiliser l'injection intégrée de littéraux de type Guice car j'ai besoin d'injecter des informations de classe. Voir un exemple ci-dessous:Guice: Pourquoi TypeLiteral <T> La méthode getRawType() renvoie la classe <? super T> au lieu de la classe <T>?

public class Foo<T> { 

    private Class<T> clazz; 

    @Inject 
    public Foo(TypeLiteral<T> literal) { 
     this.clazz = literal.getRawType(); 
    } 
} 

Il aurait parfaitement fonctionné, mais getRawType() méthode renvoie Class<? super T>. La variable interne clazz est utilisée comme argument de la méthode d'une autre classe. Si je modifie le type clazz pour être Class<? super T>, je devrais retravailler un tas de classes.

Quelle est la solution la plus élégante ici?

Répondre

1

Vous pouvez lancer le type brut au Class<T> dans ce cas, si vous pourriez finir par avoir comme sans contrôle, comme suit:

@Inject 
public Foo(TypeLiteral<T> literal) { 
    this.clazz = (Class<T>) literal.getRawType(); 
} 

Pour répondre à votre question de savoir pourquoi il le fait, il y a la même réponse à Why does Guava's TypeToken<T>.getRawType() return Class<? super T> instead of Class<T>. qui a un très bel exemple comme réponse.

+0

Ouais, je sais que je peux le lancer, à quel point c'est sécuritaire? Et pourquoi cette méthode ne renvoie pas la classe à la place? –

+0

@IhorM. mis à jour la réponse, idéalement, cela devrait être une copie du lien partagé. voter pour cela – nullpointer