Я работаю над андроидным приложением, и я пытаюсь ввести поле типа, параметризованное в абстрактном классе: BaseListFragment
public abstract class BaseListFragment<E, A extends ArrayAdapter<E>, S> extends BaseFragment { @Inject protected S service; }
Но я получаю следующую ошибку при компиляции: error: не удается найти класс символов 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> { }
Нужно ли вставлять параметризованный тип?
С Уважением,
Начиная с версии 2.0.1, Dagger 2 поддерживает тип инъекции, о котором вы говорите. Взгляните на GenericTest
для всех различных перестановок.
У меня была такая же проблема и обойти ее, добавив непараметрированный внутренний класс и введя в него. Затем используйте геттер, чтобы получить введенный класс.
Это выглядит так:
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 (который создает среда выполнения android), я бы предложил передать службу в вызове супер-конструктору.
В этом случае я бы предложил ввести службу в конкретные классы и предоставить ее с использованием абстрактного метода:
protected abstract S getService();