Guice,扩展接口和构造函数返回类型



接口A及其实现:

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

扩展接口 A 的接口 B 及其实现:

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 中调用它。我的主要目标是让用户可以扩展 A 并在 D 中使用此功能。

如果我在 B 中添加任何新方法,如果不强制转换为 B,我就无法在 D 中调用它。我的主要目标是让用户可以扩展 A 并在 D 中使用此功能。

如果用户需要B提供的功能,但不是A,他们应该声明他们需要一个BD 应该声明它需要的内容 - 而不是依赖强制转换来确保它的正确配置超出了声明的范围。

最新更新