1

独自の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はViewとResultsを拡張し、StringKeyはKeyを実装します

メソッドaddStage(...)は、次のコンパイル時エラーをスローします。

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

任意の助け、またはより良い実践は、大いに感謝されます

4

2 に答える 2

2

メソッドのプロトタイプを次のように変更してみてください。

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>>ください。これにより、Presenter自体ではなく、ClassofPresenterのサブクラスを渡すことができます。

于 2011-06-16T13:01:38.267 に答える
1

自分で試したことはありませんが、ちょっとしたことで

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

する必要があります

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

最初にアレックスの提案を試してください。コードを読みやすくし、私のものよりもいくらか意味があります。両方が失敗した場合は、それらを組み合わせます。

于 2011-06-16T13:01:40.133 に答える