如何将方法引用传递给协变参数

时间:2018-02-23 11:51:42

标签: java generics lambda covariance method-reference

鉴于我们有以下类的方法:

class Fruit {}
class Orange extends Fruit {}

void process(Consumer<? extends Fruit> action) {}
void eatOnlyOranges(Orange evt) {}

编译时没有任何警告。

    Consumer<Orange> consumer = this::eatOnlyOranges;
    process(consumer);

我想允许这个,但它没有编译?

    process(this::eatOnlyOranges);

我可以更改process(Consumer<? extends Fruit> action)的签名以使其正常工作吗?

注意:请假设process(..)的实施将检查给定的Consumer是否可以处理给定的Fruit。此详细信息与此问题无关。

2 个答案:

答案 0 :(得分:1)

除了@ EmersonCod的回答,将方法签名更改为

<T extends Fruit> void process(Consumer< T > action) {
    // ...
}

似乎可以胜任。

答案 1 :(得分:0)

您需要将RelativeLayout转换为特定类型

ConstraintLayout