1 回答

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
Java 有時(shí)就是這樣???;旧夏枰龅氖嵌x一個(gè)具體的類型參數(shù),它引用回被聲明的類,而不是使用通配符。我的意思是,而不是
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>>
準(zhǔn)確地說,像這樣定義基類
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();
}
}
添加回答
舉報(bào)