guiceファクトリ支援インジェクトを使用して作成され、抽象クラスから拡張されたクラスのインスタンスを作成するにはどうすればよいですか?

Crusaderpyro

私は次のようなひらめきを持っています:

~interface Car

  ~ abstract class SportsCar

     ~ class Ferrari

FerrariFactoryを使用してクラスFerrariのインスタンスを作成します(モジュールのコードを以下に示します)。

install(new FactoryModuleBuilder().build(FerrariFactory.class));

FerrariFactoryインターフェースには、アシストインジェクトを使用してパーツを注入する次のメソッドがあります(これは、すべてのパーツ、つまりフェラーリ固有のパーツ+スポーツカーパーツを含むxml要素です)。

Ferrari create(@Assisted Element partsElement);

フェラーリインスタンスを作成するとき、私は以下を使用しています:

ferrariFactory.create(partsElement);

フェラーリコンストラクターが最初に呼び出されます。

   @Inject
public Ferrari(Element parts) {
    super(parts);
    this.ferrariRadio= getElementValue(parts, "Parts/FerrariParts/ferrariRadio");
}

最初の行はSportsCarのスーパークラスコンストラクターの呼び出しであるため、次のようになります。

        public SportsCar (Element parts) {
        super();
        System.out.println("SportsCarconstructor: 1");
        System.out.println("SportsCarconstructor: 2 "+parts);
...
... // where I set the basic parts from the parts xml element
}

SportsCarは抽象であるため、guiceモジュールには拘束力がありません。バインドする方法がわかりません。また、null経由で何にもアクセスしていないのに(nullポインターの奇妙なケース)、SportsCarコンストラクターの2番目のsysout行でNullPointerExceptionが発生します。

それがバインディングの問題であるかどうか、または私のabstractclassコンストラクターがパーツを設定できない理由についての提案はありますか?

Crusaderpyro

OK。答えが見つかりました。私は2つのことを見逃していました:

1. Ferrariコンストラクターで@Assistedアノテーションを見逃しました:

    @Inject
    public Ferrari(@Assisted Element parts) {
     super(parts);
....
    }

2.次のようにモジュールで抽象クラスと実装を宣言できます。

install(new FactoryModuleBuilder().implement(SportsCar.class,Ferrari.class).build(FerrariFactory.class));

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ