2011-06-16 77 views
1

我正在创建自己的MVP框架,而且我遇到了仿制药的麻烦。Java方法中的嵌套泛型?

我的演讲是这样定义的,具有子元素这也是通用主持人的内部类持有引用:

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

where ResultsView,SearchView extend View and Results,St ringKey实施重点

的方法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

试图改变方法原型:我变Class<Presenter<TChildView, TChildKey>>Class<? extends Presenter<TChildView, TChildKey>>

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

讲究。这将允许您传递Presenter类的子类而不是Presenter本身。

+0

这很完美,谢谢 – davecass 2011-06-16 15:16:36

1

我没有尝试过自己,而是出于一种预感,我会说,

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

应该

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

首先尝试亚历克斯建议。保持代码更易读,比我的更有意义。如果两者都失败,请合并它们。