我试图产生一些类来控制模型视图呈现器应用程序。我已经提出了以下定义,但是正在努力避免递归泛型。

public abstract class Presenter<V extends View<...?>> {

  protected V view;

  public Presenter(V view) {
    this.view = view;
  }

  // ...
}


public abstract class View<P extends Presenter<...?>> {

  protected P presenter;

  // ...
}

我想在两个班级之间建立相互关系。我的想法是,我可以为特定的View实例化Presenter,这两个类都依赖于抽象基类中定义的有用方法,而这两个类都确切知道正在使用对应抽象类的哪个子类。

我的问题是定义代码的..?部分。我看不到一种避免递归情况的方法,例如:
public abstract class View<P extends Presenter<V>, V extends View<Q>, Q extends...>

甚至那个定义也不是一致的,因为View类现在带有两个通用参数...质量混乱。

我基本上是想避免类被抽象类类型的引用弄得乱七八糟,需要在整个具体实现中进行大量转换,如下所示:
// simpler option

public abstract class Presenter {

  protected View view;

  public Presenter(View view) {
    this.view = view;
  }
}

public class FooPresenter extends Presenter {

  public FooPresenter(BarView view) {
    super(view);
  }

  public someMethod() {
    ((BarView) getView()).viewSpecificMethod();
  }
}

这些类的每个具体实现都需要不断地从抽象类型转换为“知道”正在使用的类型。

最佳答案

尝试

public abstract class Presenter<V extends View<? extends Presenter<?>>>


public abstract class View<P extends Presenter<? extends View<?>>>

这将限制演示者将任何视图作为其通用参数,并将视图限制为具有任何演示者。

07-28 01:20
查看更多