インターフェイス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(){};
}
Aが注入される抽象クラスC:
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に新しいメソッドを追加すると、BにキャストせずにDで呼び出すことはできません。私の主な目標は、ユーザーがAを拡張してこの機能をDで使用できるようにすることです。