【问题标题】:Possibly recursive Java generics between two classes两个类之间可能递归的 Java 泛型
【发布时间】:2011-05-09 03:47:45
【问题描述】:

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

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

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

【问题讨论】:

    标签: java generics


    【解决方案1】:

    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;
    

    【讨论】:

    • 感谢您的回复。与当前解决方案相比,此设计是否具有优势?另外,.view.presenter 子句是否必要?
    • @Duncan Jones “与当前解决方案相比,这种设计是否具有优势?”就像@Thomas 所说,“这将限制演示者拥有任何视图作为他们的通用参数和视图拥有任何演示者。”我确信这是正确的答案,因为我很确定另一个可以有一个类型孔,尽管我现在没有时间证明它。
    【解决方案2】:

    试试

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 2022-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多