如何在Java中使用“循环”泛型?

时间:2011-08-25 07:46:52

标签: java generics compiler-errors

编译包含一些泛型的以下代码时出错:

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<T>) in the type HasAState<capture#1-of ? extends State<T>> is not applicable for the arguments (State<T>)

实际上我想要的是:class A implements HasAStateclass B extends State<A>其中B引用A并且可以调用A.addState(B)(仅限{}因为B扩展了State<A>),而A可以调用B.setParent(this)

我应该如何声明我的课程,以便我打算做什么工作?

由于

2 个答案:

答案 0 :(得分:6)

我同意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中第二行的警告。

答案 1 :(得分:0)

我的分析 -

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

  2. B通过A有一些州(通过包含A的引用)( 因为B extends State<A>

  3. 上述A中的州基本上位于B(因为A.addState(B))(?)

    这对我来说是一个非常复杂的设计。你可以发布什么是你的设计本质而不提及方法和参数吗?