8

私はアンドロイドアプリケーションに取り組んでおり、抽象クラスでパラメータ化されたタイプのフィールドを注入しようとしています: BaseListFragment

public abstract class BaseListFragment<E, A extends ArrayAdapter<E>, S> extends BaseFragment
{
    @Inject protected S service;
}

しかし、コンパイル時に次のエラーが発生します:エラー:シンボルクラスSが見つかりません

BaseFragment のコードは次のとおりです。

public class BaseFragment extends Fragment
{
    @Override public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        ((App) getActivity().getApplication()).inject(this);
    }
}

ここに私のサービスモジュールがあります:

@Module(
        complete = false,
        library = true
)
public class ServiceModule
{
    @Provides @Singleton BucketService provideBucketService(RestAdapter restAdapter)
    {
        return restAdapter.create(BucketService.class);
    }

    @Provides @Singleton ProjectService provideProjectService(RestAdapter restAdapter)
    {
        return restAdapter.create(ProjectService.class);
    }

    @Provides @Singleton ShotService provideShotService(RestAdapter restAdapter)
    {
        return restAdapter.create(ShotService.class);
    }

    @Provides @Singleton TeamService provideTeamService(RestAdapter restAdapter)
    {
        return restAdapter.create(TeamService.class);
    }

    @Provides @Singleton UserService provideUserService(RestAdapter restAdapter)
    {
        return restAdapter.create(UserService.class);
    }
}

BaseListFragment を拡張するクラスの例を次に示します。

public class ProjectFragment extends BaseEntityFragment<Project, ProjectViewAdapter, ProjectService>
{
}

パラメータ化された型を注入する方法はありますか?

よろしく、

4

3 に答える 3

7

2.0.1 リリースの時点で、Dagger 2 あなたが話している種類の注射をサポートしています。GenericTestさまざまな順列のすべてを見てください。

于 2015-07-14T22:31:20.523 に答える
4

私は同じ問題を抱えていましたが、パラメータ化されていない内部クラスを追加してそれに注入することで回避しました。次に、ゲッターを使用して、注入されたクラスを取り出します。

次のようになります。

public class MainClass<T>{

   UtilityClass utility;

   public MainClass(){
       utility = new InjectorHelper().getHelper();
   }

   ...

   public static class InjectorHelper{

       @Inject
       UtilityClass utilityClass;

       public InjectorHelper(){
           Injector.getInstance().getAppComponent().inject(this);
       }

       public UtilityClass getUtilityClass(){
           return utilityClass
       }
   }
}
于 2016-02-03T00:06:10.550 に答える
0

私もそれを機能させることができませんでした。それは、開発者が書くコードとまったく同じコードを生成するというダガーの設計哲学に反していると思います。

この場合、抽象クラス用のインジェクション アダプターと具象クラス用の別のインジェクション アダプターが生成されます。抽象クラスへの一般的な引数を使用すると、基本的に、各具象クラス インジェクターで抽象クラスからフィールドを注入する必要があります。

それが Android オブジェクト (Android ランタイムが作成する) でない場合は、スーパー コンストラクターへの呼び出しでサービスを渡すことをお勧めします。

この場合、具象クラスにサービスを注入し、抽象メソッドを使用して提供することをお勧めします。

protected abstract S getService();
于 2015-01-23T15:34:21.297 に答える