2015-04-16 39 views
6

Supponiamo che io ho il seguente schema ripetuto spesso nel mio codice:Guice: come legare i generici per TUTTI i tipi?

class A<T> { 
    @Inject 
    public A(List<T> list) { 
     // code 
    } 
} 

voglio legare tuttoList<T>-ArrayList<T>. So che posso usare TypeLiteral s per associare un tipo grezzo esplicito, ad esempio List<String>, ma è comunque necessario farlo per tutti i tipi?

In sostanza, questo codice non dovrebbe fallire perché non mi lego Lista esplicitamente:

injector.getInstance(new Key<A<Integer>>(){}); 
+1

in base a ciò che ho trovato e provato finora. Non è possibile. –

+1

Alcune discussioni su questo tipo di associazione "jolly" possono essere trovate qui: https://github.com/google/guice/issues/852 –

risposta

3

questo non è possibile in Guice. Internamente Guice è poco più di un HashMap<Key, Provider<?>>, dove uno Key rappresenta un'annotazione vincolante facoltativa e un singolo tipo completo. Per abbinare uno "schema" di tipi richiederebbe che una chiave si comportasse più come un predicato, il che richiederebbe un'architettura molto diversa e che renderebbe la ricerca vincolante molto più lenta.

Inoltre, sebbene sia possibile utilizzare List per un semplice esempio, è importante ricordare che i binding Guice sono meglio riservati per implementazioni equivalenti che potrebbero variare in produzione o test. Oltre ad avere caratteristiche di performance molto specifiche dell'algoritmo, le implementazioni di List variano nella loro capacità di gestire gli articoli null e, una volta scelto l'implementazione di un elenco ideale per un determinato algoritmo, è improbabile che sia necessario cambiarlo, specialmente in un configurazione a livello di applicazione.

Se si vuole essere in grado di variare le vostre implementazioni generiche con la configurazione in stile Guice, creare una piccola fabbrica come ListFactory:

public class ListFactory { 
    public <T> List<T> createFooBarList() { return new ArrayList<T>(); } 
    public <T> List<T> createSomeOtherList() { return new LinkedList<T>(); } 
} 
Problemi correlati