dagger不能注入类型参数字段

时间:2015-01-22 00:13:21

标签: android dependency-injection dagger dagger-2

我正在开发一个Android应用程序,我试图注入一个在抽象类中参数化的字段: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>
{
}

无论如何都要注入参数化类型吗?

此致

3 个答案:

答案 0 :(得分:7)

自2.0.1版本开始,Dagger 2 support您正在谈论的注射类型。查看所有各种排列的GenericTest

答案 1 :(得分:4)

我遇到了同样的问题,并通过添加一个非参数化的内部类并注入其中来解决它。然后使用getter来获取注入的类。

看起来像这样:

 for (var j = 0; j < albumIds.length; j++) { 
    var request = albumIds[j] + "/photos";
    FB.api(request, 'get', {
      access_token: userToken
    }, function(responses) {
      var pictureUrl = responses.data.url; // no url returned - only a photo id

     
    });

答案 2 :(得分:0)

我也无法让它工作,我认为这违背了dagger的设计理念,即生成与开发人员也写的完全相同的代码。

在这种情况下,它为抽象类生成一个注入适配器,为具体类生成另一个注入适配器。使用抽象类的泛型参数,您必须从每个具体类注入器中的抽象类中注入字段。

如果它不是android对象(android运行时创建的),我建议在调用超级构造函数时传递服务。

在这种情况下,我建议在具体类中注入服务并使用抽象方法提供它:

protected abstract S getService();