2012-12-02 75 views
1

接口A和它的實現:吉斯,延伸接口和構造返回類型

public interface A<K, E> { 
    public void foo(); 
} 

public abstract class AImpl<K, E> implements A<K, E> { 
    public void foo(){}; 
} 

界面B,它擴展接口A,和它的實現:

public interface B extends A<Integer, String> { 
    public void bar(); 
} 

public class BImpl extends AImpl<Integer, String> implements B { 
    public void bar(){}; 
} 

一個抽象類C,它獲取A噴出:

public abstract class C<K, E> { 
    A<K, E> a; 

    @Inject 
    public setA(A<K, E> a){ 
     this.a = a; 
    } 

    public A<K, E> getA(){ 
     return a; 
    } 
} 

隨着吉斯:

bind(new TypeLiteral<A<Integer, Book>>(){}).to(BImpl.class); 

而最後的類,它擴展了C類:

public class D extends C<Integer, String> { 
    public void fooBar(){ 
     this.getA().bar(); //Gets BImpl injected by Guice, and call bar(): Not working - error 
     ((B) this.getA()).bar(); //Working 
    } 
} 

喜歡,你可以從在線評論看,BImpl被正確注射,可以使用,如果沒有額外的方法,擴展A(接口B是空的)。如果我B中添加任何新的方法,我不能沒有它鑄造B.我的主要目標是把它稱爲d,給用戶的可能性在D.

回答

3

擴展和使用這一功能,如果我在B中添加任何新的方法,但是我不能在D中調用它,而不將它投射到B.我的主要目標是給予用戶擴展A並在D中使用此功能的可能性。

如果用戶需要由B提供的功能,但不是A,他們應該聲明他們需要 a B。類D應該聲明它需要的東西 - 不要依賴投射來確保它已正確配置超出所聲明的範圍。