Возможно, рекурсивные дженерики Java между двумя классами

Я пытаюсь создать несколько классов для управления приложением «модель-представление-презентатор». Я придумал следующие определения, но изо всех сил стараюсь избегать рекурсивных обобщений.

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;

  // ...
}

Я хотел установить взаимоотношения между двумя классами. Идея заключалась в том, что я мог бы создать экземпляр 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();
  }
}

Каждая конкретная реализация этих классов должна будет постоянно преобразовывать абстрактный тип к типу, который, как она "знает", используется.

5
задан Duncan Jones 8 May 2011 в 19:17
поделиться