亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

java:強相關的類對

java:強相關的類對

達令說 2023-05-24 15:57:14
我有一對彼此相關的課程:Msg1 <-> Data1Msg2 <-> Data2...所有“DataX”都擴展了超類“Data”,“MsgX”擴展了類“Msg”。這些超類目前(已簡化):abstract class Data< MSG extends Msg<? extends Data<MSG>>> {       MSG msg;       void modify( MSG msg ) {           this.msg = msg;       };   }和:abstract class Msg< DATA extends Data<? extends Msg<DATA>>> {    abstract DATA createData();    void modifyData( DATA data ) {        data.modify( this );    };  }但是,這兩個類 Data 和 Msg 的編譯失敗,語句“data.modify(this);”出現以下錯誤:Msg.java:5: error: method modify in class Data<MSG> cannot be applied to given types;            data.modify( this );                ^  required: CAP#1  found: Msg<DATA>  reason: argument mismatch; Msg<DATA> cannot be converted to CAP#1  where DATA,MSG are type-variables:    DATA extends Data<? extends Msg<DATA>> declared in class Msg    MSG extends Msg<? extends Data<MSG>> declared in class Data  where CAP#1 is a fresh type-variable:    CAP#1 extends Msg<DATA> from capture of ? extends Msg<DATA>1 error有什么建議嗎?我已經嘗試了十分之一的變體,添加和刪除“?”,“擴展”,......但他們都以某種方式失敗了。
查看完整描述

1 回答

?
慕雪6442864

TA貢獻1812條經驗 獲得超5個贊

Java 有時就是這樣???;旧夏枰龅氖嵌x一個具體的類型參數,它引用回被聲明的類,而不是使用通配符。我的意思是,而不是


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();

    }

}


查看完整回答
反對 回復 2023-05-24
  • 1 回答
  • 0 關注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號