为了账号安全,请及时绑定邮箱和手机立即绑定

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 有时就是这样🤷。基本上您需要做的是定义一个具体的类型参数,它引用回被声明的类,而不是使用通配符。我的意思是,而不是


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 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信