可能是两个类之间的递归Javagenerics

我正在尝试生成一些类来控制模型 – 视图 – 展示器应用程序。 我已经提出了以下定义,但我正在努力避免递归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 extends View, 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>> 

 public abstract class View

>>

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

对于此类型,请使用第二个类型参数:

 class Presenter

, V extends View> { V view; } class View

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

然后你可以这样做:

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