【问题标题】:How to get "circular" generics working in Java?如何让“循环”泛型在 Java 中工作?
【发布时间】:2011-11-03 10:42:35
【问题描述】:

我在编译以下涉及一些泛型的代码时出错:

public abstract class State<T extends HasAState<? extends State<T>>>{
    protected T parent;

    public void setParent(){ // It's been simplified for the sake of the question!
        parent.removeState(this); // Error here!
        this.parent = parent;
        parent.addState(this);    // Error here!
    }
}

public interface HasAState<T extends State<? extends HasAState<T>>> {
    public void addState(T state);
    public void removeState(T state);
}

错误是:The method removeState(capture#1-of ? extends State&lt;T&gt;) in the type HasAState&lt;capture#1-of ? extends State&lt;T&gt;&gt; is not applicable for the arguments (State&lt;T&gt;)

实际上我想要的是:class A implements HasAStateclass B extends State&lt;A&gt; 其中B 引用了A 并且可以调用A.addState(B)(只是因为B 扩展了State&lt;A&gt;)和其中A 可以调用B.setParent(this)

我应该如何声明我的类以便我打算做的工作?

谢谢

【问题讨论】:

  • 我认为你应该重新考虑你的设计......所有这些泛型真的有必要吗?也许有一种更简单的方法来实现您想要实现的目标?
  • Here 是在 Java 中创建循环泛型引用的一种方法。如果这不是您想要的,browse similar threads.
  • 我尝试了您的建议,但在同一位置出现另一个错误:The method addState(E) in the type HasAState&lt;P,E&gt; is not applicable for the arguments (State&lt;P,E&gt;)

标签: java generics compiler-errors


【解决方案1】:

我同意 Eran Zimmerman 的评论。似乎你需要重新考虑你想要什么。

无论如何我希望我已经理解了这个问题,所以我将参数从一个更改为拖曳,以分别描述statehasAState

public abstract class State<S extends State<S, H>, H extends HasAState<S, H>>{
    protected H parent;

    public void setParent(){ 
        parent.removeState(this);
        this.parent = parent; //!!!this line has no effect!!!
        parent.addState(this);        
    }       
}

public interface HasAState<S extends State<S, H>, H extends HasAState<S, H>> {
    public void addState(State<S, H> state);
    public void removeState(State<S, H> state);
}

此代码编译! -- 注意setParent中第二行的警告。

【讨论】:

    【解决方案2】:

    我的分析 -

    1. A 有一些状态。 (因为A implements HasState

    2. B 通过A 具有某种状态(通过包含A 的引用)( 因为B extends State&lt;A&gt;)

    3. 上面A中的状态本质上是在B中保存的(因为A.addState(B))(?)

      在我看来,这是一个非常复杂的设计。你能在不提及方法和参数的情况下发布你的设计精髓吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      • 2018-05-26
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 1970-01-01
      相关资源
      最近更新 更多