2011-06-16 5 views
1

Je crée mon propre framework MVP, et j'ai des problèmes avec les génériques.Génériques imbriqués dans les méthodes Java?

Mon présentateur est défini comme celui-ci, avec une des références de maintien de la classe interne à des éléments enfants qui sont aussi les présentateurs génériques:

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); 
     } 
    } 
} 

et moi avons mises en œuvre concrètes de cette

public class ResultsPresenter extends Presenter<ResultsView, Results> 

et

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

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

où ResultsView, SearchView étendre Voir et résultats, St ringKey mettre en œuvre la clé

La méthode addStage (...) renvoie l'erreur de compilation suivante:

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

Toute aide, ou meilleures pratiques, serait grandement apprécié

Répondre

2

Essayez de changer la méthode prototype:

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

attention de salaire que j'ai changé Class<Presenter<TChildView, TChildKey>>-Class<? extends Presenter<TChildView, TChildKey>>. Cela vous permettra de passer la sous-classe Class of Presenter au lieu de Presenter lui-même.

+0

C'est parfait, merci – davecass

1

Je ne l'ai pas essayé moi-même, mais sur une intuition, je dirais que

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

devrait être

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

Essayez suggestion Alex premier. Maintient le code plus lisible et a un peu plus de sens que le mien. Si les deux échouent, combinez-les.

Questions connexes