Dagger无法注入类型参数字段。

8

我正在开发一款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个回答

7
从2.0.1版本开始,Dagger 2 确实 支持 你所说的注入类型。请查看GenericTest以获取所有不同的组合方式。

4

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

代码如下:

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
       }
   }
}

0

我也无法让它起作用,我认为这违背了Dagger的设计理念,即生成代码与开发人员编写的代码完全一致。

在这种情况下,它为抽象类生成一个注入适配器和另一个用于具体类。对于抽象类的通用参数,您必须在每个具体类注入器中注入来自抽象类的字段。

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

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

protected abstract S getService();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接