接口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;
}
}
使用 Guice:
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 中添加任何新方法,我不能在 D 中调用它而不将它转换为 B。我的主要目标是让用户可以扩展 A 并在 D 中使用此功能。