По сути, моя проблема сводится к тому, что метод в абстрактном суперклассе не может быть одновременно абстрактным и статическим (то есть статические методы не могут быть переопределены в Java), и поэтому я не могу "утверждать", что мой Пользовательский фрагмент имеет метод newInstance (HashMap), если весь код знает, что он пытается создать фрагмент.
Вероятно, это действительно сбивало с толку, поэтому позвольте мне объяснить подробнее.
У меня есть некоторый код, который автоматически создает серию фрагментов для отображения на основе ArrayList «parameterList» HashMaps. (Т.е. параметрList.get (3) будет параметрами для 3-го фрагмента).
public void setupFragments()
{
ArrayList<HashMap<String, Object>> parameterList = new ArrayList<>();
...
...
for(HashMap<StringObject> fragmentParams : parameterList){
createNewFragment(...)
}
}
private void createNewFragment(...){
...
}
У меня есть несколько различных типов (классов) фрагментов, которые все наследуются от абстрактного класса, называемого «GameFragment», который сам расширяет фрагмент.
Что я хотел бы сделать, так это добавить к параметрам любого данного фрагмента класс / тип фрагмента. То есть как то так:
public class ATypeOfFragment extends GameFragment{...}
public class AnotherTypeOfFragment extends GameFragment{...}
public abstract class GameFragment extends Fragment{...}
public void setupFragments()
{
ArrayList<HashMap<String, Object>> parameterList = new ArrayList<>();
HashMap<String, Object> firstFragmentParams = new Hashmap<>();
firstFragmentParams.put("fragmentType", ATypeOfFragment.class);
parameterList.add(firstFragmentParams);
HashMap<String, Object> secondFragmentParams = new Hashmap<>();
firstFragmentParams.put("fragmentType", AnotherTypeOfFragment.class);
parameterList.add(secondFragmentParams);
for(HashMap<StringObject> fragmentParams : parameterList){
createNewFragment((Class<GameFragment>) fragmentParams.get("fragmentType"))
}
}
private void createNewFragment(Class<GameFragment> class){
...
}
Теперь проблема в том, есть ли способ заставить эту работу? Есть ли способ, которым я могу написать функцию createNewFragment, где он будет создавать фрагмент указанного класса?
Во-первых, я еще не очень хорошо понимаю общие классы (как вы, вероятно, можете сказать).
Во-вторых, другая проблема заключается в том, что, поскольку это фрагмент Android, я не могу изменить или даже вызвать конструктор. Фрагменты Android создаются с помощью статической функции "newInstance (...)".
Теперь вы можете начать видеть проблему. То, что я хотел бы сделать, - это иметь абстрактный статический метод "newInstance (...)" в GameFragment (или другой интерфейс, если необходимо), чтобы моя функция createNewFragment могла просто вызывать "class.newInstance (...)".
public abstract class GameFragment extends Fragment{
...
public abstract static GameFragment newInstance(...);
}
private void createNewFragment(Class<GameFragment> class){
GameFragment newFragment = class.newInstance(...);
//Not that this would work anyway, again I don't understand generic classes very well yet
}
Однако в Java нельзя иметь метод, который может быть как абстрактным, так и статическим.
Есть ли какой-нибудь альтернативный способ сообщить моей программе, что универсальный класс гарантированно имеет определенный статический метод?
Если нет, я просто создам функцию «словарь», которая отображает определенные строки в функцию newInstance (...) всех моих классов (Game) Fragment. Однако, конечно, я бы предпочел не выполнять этот тип «ведения домашнего хозяйства» всякий раз, когда я расширяю свое приложение новыми типами фрагментов.