【问题标题】:dagger cannot inject type parameter field匕首无法注入类型参数字段
【发布时间】:2015-01-22 00:13:20
【问题描述】:

我正在开发一个 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>
{
}

到底有没有注入参数化类型?

问候,

【问题讨论】:

    标签: android dependency-injection dagger dagger-2


    【解决方案1】:

    在 2.0.1 版本中,Dagger 2 确实 support 您所说的注入类型。查看GenericTest 了解所有各种排列。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,并通过添加一个非参数化的内部类并注入它来解决它。然后使用 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
             }
         }
      }
      

      【讨论】:

        【解决方案3】:

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

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

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

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

        protected abstract S getService();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-11-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多