可能是两个类之间的递归Java泛型

时间:2011-05-08 19:17:14

标签: java generics

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

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

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

2 个答案:

答案 0 :(得分:3)

this的类型使用第二个类型参数:

class Presenter<P extends Presenter<P,V>, V extends View<P,V>> {
    V view;
}

class View<P extends Presenter<P,V>, V extends View<P,V>> {
    P presenter;
}

class MyPresenter extends Presenter<MyPresenter, MyView>{}

class MyView extends View<MyPresenter, MyView>{}

然后你可以这样做:

MyPresenter mp = new MyPresenter().view.presenter;

答案 1 :(得分:1)

尝试

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

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

这会限制演示者将任何视图作为其通用参数和视图以包含任何演示者。