在以下示例代码中,我无法理解为什么它为incompatible types: invalid method reference而不是case II抱怨case I。尽管java.awt.Color::brighterNewBrightColor::brightColor具有相似的方法签名。

public static void main(String[] args) {

        // CASE I
        Function<Color, Color> brighter = Color::brighter;

        // CASE II
        Function<Color, Color> newBrighter = NewBrightColor::brightColor;

    }

class NewBrightColor {
    public Color brightColor() {
        // return some Bright color
    }
}


编辑:

我已从演示https://youtu.be/e4MT_OguDKg?t=31m58s中获取了此示例

根据我的理解,Function<R,T>应该只接受输入为R且输出为T的那些函数。但是在case I中不是真的(Function<Color, Color>期望将Color作为输入,但是brighter()输入的无效),但是仍然没有编译错误,但是在case II中会引发编译问题。

最佳答案

查看Color.brighter的签名

public Color brighter();


现在查看您的方法参考:

Function<Color, Color> brighter = Color::brighter;


因此,当我呼叫brighter.apply(color)时,我呼叫color.brighter并返回结果。

现在查看NewBrightColor.brightColor的方法签名:

public Color brightColor(Color color)


并看一下功能参考

Function<Color, Color> newBrighter = NewBrightColor::brightColor;


调用newBrighter.apply(colour)时,需要在brightColor的实例上调用NewBrighter并返回结果。

因此,我缺少一个参数-我需要一个Color使其更亮*和**我需要一个我要调用NewBrightColorbrightColor,并传递颜色。



所以,你可以

1)使用BiFunction传递实例:

BiFunction<NewBrightColor, Color, Color> newBrighter = NewBrightColor::brightColor


这将在调用newBrighter.apply(brighter, color)时调用brighter.brightColor(color)

2)在Function的实例上定义NewBrighter

NewBrighter nb = //somehow get an instance
Function<Color, Color> newBrighter = nb::brightColor;


这将在调用newBrighter.apply(color)时调用nb.brightColor(color)

10-08 00:45