Кинжал не может вводить поле параметра типа

Я работаю над андроидным приложением, и я пытаюсь ввести поле типа, параметризованное в абстрактном классе: 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(); 
Intereting Posts
Проект Clean Project vs Rebuild Project и Project в Android Studio Droid: Как получить идентификатор кнопки из метода onClick, описанного в XML? Не удается разрешить метод getSupportFragmentManager () внутри фрагмента Значение некоторых констант Paint в Android Как выполняется сопоставление между ресурсами android ресурсов и ID ресурсов? WebGL не работает в PhoneGap Android KitKat Внедрение масштабирования и перетаскивания с использованием сборки Android в прослушивании жестов и прослушивании шкалы Получение IP-адреса моей локальной сети (192.168.xxxx) (IPV4) Разница между bind и injectView в butterknife TextInputLayout не показывает подсказку EditText, прежде чем пользователь будет фокусироваться на ней ObjectAnimator с использованием наборов CharSequence Android. Команда «Процесс»> «… aapt.exe» завершена с ненулевым значением> exit 1 WebView с https loadUrl показывает пустую страницу Обновить активность без повторного открытия? Фильтр Калмана: как использовать его без «модели перехода состояния»?