Вложенные дженерики в методах Java? - PullRequest
1 голос
/ 16 июня 2011

Я создаю свою собственную инфраструктуру MVP, и у меня возникают проблемы с универсальными шаблонами.

Мой презентатор определен следующим образом: внутренний класс содержит ссылки на дочерние элементы, которые также являются универсальными презентаторами.:

public abstract class Presenter<TView extends View, TKey extends Key>
{
    protected final HashMap<String, StageInstances<?, ?>>   _stages;

    public <TChildView extends View, TChildKey extends Key> void addStage(Class<Presenter<TChildView, TChildKey>> stage, String name)
    {
        _stages.put(name, new StageInstances<TChildView, TChildKey>(stage));
    }

    // ...

    protected class StageInstances<TChildView extends View, TChildKey extends Key>
    {
        protected Class<Presenter<TChildView, TChildKey>>       _presenter;
        protected HashMap<Key, Presenter<TChildView, TChildKey>>    _instances;

        public StageInstances(Class<Presenter<TChildView, TChildKey>>   presenter)
        {
            _presenter = presenter;
            _instances = new HashMap<Key, Presenter<TChildView, TChildKey>>();
        }

        public Presenter<?, ?> getInstance(Key key)
        {
            if (!_instances.containsKey(key))
            {
                try
                {
                    _instances.put(key, _presenter.newInstance());
                } catch (Exception e)
                {
                    e.printStackTrace();

                    return null;
                }
            }

            return _instances.get(key);
        }
    }
}

и у меня есть конкретные реализации этого

public class ResultsPresenter extends Presenter<ResultsView, Results>

и

public class SearchPresenter extends Presenter<SearchView, StringKey>
{
    // ...

    public void bind()
    {
        addStage(ResultsPresenter.class, "results");
    }
}

, где ResultsView, SearchView расширяют представление и результаты, StringKey реализует ключ

Метод addStage (...) выдает следующую ошибку во время компиляции:

**The method addStage(Class<Presenter<TChildView,TChildKey>>, String) in the type 
Presenter<SearchView,StringKey> is not applicable for the arguments 
(Class<ResultsPresenter>, String)**

Любая помощь или лучшие методы будут с благодарностью приняты

Ответы [ 2 ]

2 голосов
/ 16 июня 2011

Попробуйте изменить прототип метода на:

public <TChildView extends View, TChildKey extends Key> void addStage(Class<? extends Presenter<TChildView, TChildKey>> stage, String name)

обратите внимание, что я изменил Class<Presenter<TChildView, TChildKey>> на Class<? extends Presenter<TChildView, TChildKey>>. Это позволит вам передать подкласс Class of Presenter вместо самого Presenter.

1 голос
/ 16 июня 2011

Я сам не пробовал, но я бы сказал, что

addStage(Class<Presenter<TChildView, TChildKey>> stage, String name)

должно быть

addStage(Class<Presenter<? extends TChildView,? extends TChildKey>> stage, String name)

Сначала попробуйте предложение Алекса.Делает код более читабельным и более понятным, чем мой.Если оба не удаются, объедините их.

...