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

如何让更精确类型的消费者作为不太精确类型的消费者传入?

如何让更精确类型的消费者作为不太精确类型的消费者传入?

一只萌萌小番薯 2022-03-10 21:43:20
我有以下两个功能接口:IndexBytePairConsumer.javapackage me.theeninja.nativearrays.core;@FunctionalInterfacepublic interface IndexBytePairConsumer {    void accept(long index, byte value);}IndexIntPairConsumer.javapackage me.theeninja.nativearrays.core;@FunctionalInterfacepublic interface IndexIntPairConsumer {    void accept(long index, int value);}我也有以下方法:public void forEachIndexValuePair(IndexBytePairConsumer indexValuePairConsumer) {    ...}有什么方法可以允许IndexIntPairConsumer在上述方法中传递一个(因为整数的消费者可以接受字节)?我需要在方法签名中使用原语而不是关联的类,例如Integerand Byte,因此任何抽象都变得更加困难。
查看完整描述

2 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

这是我为你发明的。


定义


public interface IndexBytePairConsumer {

    void accept(long index, byte value);

}


public interface IndexIntPairConsumer extends IndexBytePairConsumer {

    default void accept(long index, byte value) {

        this.accept(index, (int) value);

    }


    void accept(long index, int value);

}

你可以使用它


IndexIntPairConsumer c = (a,b)->{

    System.out.println(a + b);

};

forEachIndexValuePair(c);


forEachIndexValuePair((a, b) -> {

    System.out.println(a + b);

});


查看完整回答
反对 回复 2022-03-10
?
森栏

TA贡献1810条经验 获得超5个赞

在不更改类型层次结构的情况下(例如,此答案中建议的方式),适应步骤是不可避免的,因为IndexBytePairConsumer它们IndexIntPairConsumer是两种不同的类型。最小的适应步骤是


// given

IndexIntPairConsumer consumer = …


// call as

forEachIndexValuePair(consumer::accept);

正如您在问题中所说,int 的使用者可以接受字节,因此acceptan的方法是预期IndexIntPairConsumeran 的方法引用的有效目标。IndexBytePairConsumer


查看完整回答
反对 回复 2022-03-10
  • 2 回答
  • 0 关注
  • 127 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号