2016-05-15 52 views
1

有沒有什麼方法可以注入返回接口的具體實現@Produces聲明@Inject作爲@Produces返回接口的具體實現

SomeClassImpl implements SomeClass { 
    public Integer iField; 
} 

製作類:

@Produces 
public SomeClass produceChild(){ 
    SomeClassImpl impl = new SomeClassImpl(); 
    impl.iField = 17; 
    return impl; 
} 

Consumer類:

@Inject SomeClassImpl classImpl; 

編輯

的企圖@Inject SomeClassImpl不強迫容器使用@Produces方法,返回超類型SomeClass

爲什麼可以通過@Inject父類型(沒有生產者)注入子類型,但沒有變種通過@Produces父類型注入子類型?

+0

使用[預選賽](https://docs.oracle.com/javaee/6/tutorial/doc/gjbck.html),如果你有一個以上的實現一個接口 – ares

+0

參見[這個答案](HTTP的: //stackoverflow.com/questions/22982422/cdi-ambiguous-dependency-with-produces-why)。 – Casey

+0

關於你的編輯,因爲你的'@ Produces'方法產生一個'SomeClass'實例,而不是'SomeClassImpl'實例,它可以返回任何'SomeClass'的實現,而不僅僅是'SomeClassImpl'實例。你可以通過注入'SomeClass'(不是實現)並使用限定符來修復它,或者修改你的'@ Produces'方法來返回'SomeClassImpl'。 – Casey

回答