2013-10-07 26 views
5

Ho una classe modello astratta generica. Ho pensato che se avessi creato produttori specifici per tipo, avrei potuto inserire alcuni servizi DAO direttamente nella classe generica. Ma non posso.Perché è impossibile iniettare classi generiche?

Perché? E come potrei aggirare questo?

abstract class MyView<T> { 
    @Inject 
    MyDao<T> dao; 

    //some more template methods that make use of the dao 
    void someMethod() { 
     dao.use(); 
    } 
} 

class CustomerView extends MyView<Customer> { 
    //javax.enterprise.inject.AmbiguousResolutionException: Ambigious resolution 
} 


class DaoManager { 
    @Produces 
    MyDao<Customer> getDaoCustomer() { 
     return DaoFactory.make(Customer.class); 
    } 

    @Produces 
    MyDao<Product> getDaoProduct() { 
     return DaoFactory.make(Product.class); 
    } 
} 

Quando inietto esempio un @Inject MyDao<Customer> dao; funziona perfettamente. Ma non con i farmaci generici ...

+0

Come è implementato il tuo 'DaoFactory'? –

+1

Si prega di definire "non funziona". Inoltre, come è '@ Inject MyDao dao;' non generico? –

+0

Non funziona significa genera un'eccezione. Naturalmente MyDao è generico in una certa misura. Ancora mi piacerebbe iniettare un doa completamente generico con il metodo astratto. Non personalizzato. – membersound

risposta

6

quando si richiede

@Inject MyDao<Customer> dao; 

il contenitore sa che si desidera un fagiolo in particolare di tipo MyDao<Customer>. Se un tale bean esiste e le informazioni sul tipo sono note, il contenitore può soddisfare l'iniezione. Ad esempio, le informazioni sul tipo è conservato nel @Produces metodo annotato

@Produces 
MyDao<Product> getDaoProduct() { 

Il contenitore utilizza la reflection per recuperare quel tipo parametrico e può corrispondere al @Inject campo richiesto.

Con

abstract class MyView<T> { 
    @Inject 
    MyDao<T> dao; 

però, tutto il contenitore sa è che si desidera un MyDao. T è una variabile di tipo, non una parametrizzazione concreta. Il contenitore non può assumere un tipo specifico per questo. Nel tuo caso, entrambi i bean @Produces corrisponderebbero e ci sarebbe ambiguità.


Nel tuo esempio, sappiamo dal contesto che si vuole davvero un MyDao<Customer>. Quello non sembra essere qualcosa che il tuo contenitore è in grado di fare, cioè. cercando di risolvere il parametro type in un argomento di tipo concreto per una sottoclasse parametrizzata.

+0

@mrts ho modificato la mia risposta perché penso che avevo capito male la loro domanda allora. Ma non penso che il tuo commento rappresenti la situazione che stanno chiedendo. Il tipo di campo che stanno cercando di iniettare è 'Foo '. Il contenitore avrebbe dovuto risolvere il tipo di '' del cliente per la sottoclasse. Non sembra come fa. –

Problemi correlati