2016-11-21 5 views
0

すべて、ダガー2:生成されたコードはコンパイルされません

ダガーが生成したコードが実際にはコンパイルされない状況で助けていただければ幸いです。下のグラフのように、サブコンポーネントを使ったかなり精巧な設定があり、Sで終わるコンポーネントはサブコンポーネントです。

A - BS

|

CS-DS

|

ES - FS

すべてのサブコンポーネントがそうのようなビルダーのインタフェースが含まれています。

@Subcomponent(modules = BS_Module.class) 
public interface BS { 
    @Subcomponent.Builder 
    public interface Builder { 
     Builder requestModule(BS module); 

     BS build(); 
    } 
} 

A用のモジュールでは、私持っている他のコンポーネントへのアクセスを取得するには、次

@Provides 
@Singleton 
@Inject 
public BS provideBS(Provider<BS.Builder> builder) { 
    return builder.get().build(); 
} 

しかし、provideB 'に対して生成されたコードはコンパイルされません。

@Override 
public BS provideBS() { 
    return new BSImpl(); 
} 

しかしBSImplは、ゼロ引数のコンストラクタを持っていないdoest:私は状況がやや明らかにした

private BSImpl(BSBuilder builder) {...} 

希望、私はこれを解決取得する方法がわからないとして評価任意のヘルプ。

が私の周りに間違った方法グラフの依存関係を持って

を解決し... Aが直接提供するものBSに依存することはできません、BSは、Aが提供するもののみに依存することができます。

+0

を、あなたが取得しているコンパイルエラーを投稿してくださいことはできますか?また、標準のJavaクラス名を使用すると、ご質問のある読者に役立ちます。 –

+0

@DavidRawsonはあなたの提案に応じてクラス名を修正しました。エラーメッセージは非常に単純です:BSImplクラスのコンストラクタBSImplは与えられた型には適用できません。必須:BSBuilder、found:引数なし、理由:実際の引数と仮引数の長さが異なります。あなたの2番目のコメントあたり@DavidRawson –

+0

@DavidRawson Daggerがプライベート内部クラスとして作成するので、実際にビルダーをインスタンス化することはできません –

答えて

0

はコメントで解決:

@DavidRawson最終的に、それは非常に簡単でした。依存グラフに間違ったやり方があります... AはBSが提供するものに直接依存することはできません.BSはAが提供するものだけに依存することができます。今残っている唯一のことは、私はA.と範囲を重複するため、シングルトンを提供するために、BS取得することはできませんとしてスコープを把握することである - Michel Onstein

関連する問題