编译包含一些泛型的以下代码时出错:
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 HasAState
和class B extends State<A>
其中B
引用A
并且可以调用A.addState(B)
(仅限{}因为B
扩展了State<A>
),而A
可以调用B.setParent(this)
。
我应该如何声明我的课程,以便我打算做什么工作?
由于
答案 0 :(得分:6)
我同意Eran Zimmerman的评论。它需要重新考虑你想要的东西。
无论如何,我希望我能正确理解这个问题,所以我将参数从一个更改为两个,分别描述state
和hasAState
。
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)
我的分析 -
A
有一些状态。 (beacuse A implements HasState
)
B
通过A
有一些州(通过包含A
的引用)(
因为B extends State<A>
)
上述A
中的州基本上位于B
(因为A.addState(B)
)(?)
这对我来说是一个非常复杂的设计。你可以发布什么是你的设计本质而不提及方法和参数吗?