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

反正有注入参数化类型吗?

问候,

4

3 回答 3

7

从 2.0.1 版本开始,Dagger 2确实 支持您所说的注入类型。看看GenericTest所有的各种排列。

于 2015-07-14T22:31:20.523 回答
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
       }
   }
}
于 2016-02-03T00:06:10.550 回答
0

我也无法让它工作,我认为这违反了 dagger 的设计理念,即生成的代码正是开发人员也会编写的代码。

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

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

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

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