1

インターフェイス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で使用できるようにすることです。

4

1 に答える 1

3

B に新しいメソッドを追加すると、B にキャストせずに D で呼び出すことはできません。私の主な目標は、ユーザーが A を拡張し、この機能を D で使用できるようにすることです。

ユーザーが によって提供される機能を必要としているが必要Bでない場合は、. クラスは必要なものを宣言する必要があります。宣言された内容を超えて正しく構成されていることを確認するためにキャストに依存しないでください。ABD

于 2012-12-02T21:15:45.243 に答える