1 回答
TA贡献1812条经验 获得超5个赞
Java 有时就是这样🤷。基本上您需要做的是定义一个具体的类型参数,它引用回被声明的类,而不是使用通配符。我的意思是,而不是
abstract class Data<M extends Msg<? extends Data<M>>> {}
abstract class Msg<D extends Data<? extends Msg<D>>> {}
声明为
abstract class Data<D extends Data<D, M>, M extends Msg<M, D>>
abstract class Msg<M extends Msg<M, D>, D extends Data<D, M>>
准确地说,像这样定义基类
abstract class Data<D extends Data<D, M>, M extends Msg<M, D>> {
M msg;
void modify( M msg ) {
this.msg = msg;
};
}
abstract class Msg<M extends Msg<M, D>, D extends Data<D, M>> {
abstract D createData();
void modifyData( D data ) {
data.modify( (M) this ); // <- you still need to cast `this` though
};
}
然后你可以像这样声明子类:
class FooData extends Data<FooData, FooMsg> {
}
class FooMsg extends Msg<FooMsg, FooData> {
@Override FooData createData() {
return new FooData();
}
}
添加回答
举报