匕首无法注入类型参数字段
dagger cannot inject type parameter field
我正在开发一个 android 应用程序,我正在尝试注入一个在抽象 class 中类型参数化的字段:BaseListFragment
public abstract class BaseListFragment<E, A extends ArrayAdapter<E>, S> extends BaseFragment
{
@Inject protected S service;
}
但我在编译时遇到以下错误:
错误:找不到符号 class 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);
}
}
这里是一个 class 扩展 BaseListFragment 的例子:
public class ProjectFragment extends BaseEntityFragment<Project, ProjectViewAdapter, ProjectService>
{
}
有没有注入参数化类型?
此致,
我也无法让它工作,我认为这违背了 Dagger 的设计理念,即生成的代码正是开发人员也会编写的代码。
在这种情况下,它为抽象 class 生成一个注入适配器,为具体 class 生成另一个注入适配器。使用抽象 class 的通用参数,您基本上必须在每个具体 class 注入器中注入来自抽象 class 的字段。
如果它不是 android 对象(android 运行时创建的对象),我建议在对超级构造函数的调用中传递服务。
在这种情况下,我建议在具体 classes 中注入服务并使用抽象方法提供它:
protected abstract S getService();
从 2.0.1 版本开始,Dagger 2 可以 support the type of injection that you're talking about. Take a look at GenericTest
所有的各种排列。
我有同样的问题,通过添加一个非参数化的内部 class 并注入它来解决它。然后使用 getter 将注入的 class 取出。
看起来像这样:
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
}
}
}
我正在开发一个 android 应用程序,我正在尝试注入一个在抽象 class 中类型参数化的字段:BaseListFragment
public abstract class BaseListFragment<E, A extends ArrayAdapter<E>, S> extends BaseFragment
{
@Inject protected S service;
}
但我在编译时遇到以下错误: 错误:找不到符号 class 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);
}
}
这里是一个 class 扩展 BaseListFragment 的例子:
public class ProjectFragment extends BaseEntityFragment<Project, ProjectViewAdapter, ProjectService>
{
}
有没有注入参数化类型?
此致,
我也无法让它工作,我认为这违背了 Dagger 的设计理念,即生成的代码正是开发人员也会编写的代码。
在这种情况下,它为抽象 class 生成一个注入适配器,为具体 class 生成另一个注入适配器。使用抽象 class 的通用参数,您基本上必须在每个具体 class 注入器中注入来自抽象 class 的字段。
如果它不是 android 对象(android 运行时创建的对象),我建议在对超级构造函数的调用中传递服务。
在这种情况下,我建议在具体 classes 中注入服务并使用抽象方法提供它:
protected abstract S getService();
从 2.0.1 版本开始,Dagger 2 可以 support the type of injection that you're talking about. Take a look at GenericTest
所有的各种排列。
我有同样的问题,通过添加一个非参数化的内部 class 并注入它来解决它。然后使用 getter 将注入的 class 取出。
看起来像这样:
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
}
}
}