在以下示例代码中,我无法理解为什么它为incompatible types: invalid method reference
而不是case II
抱怨case I
。尽管java.awt.Color::brighter
和NewBrightColor::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
使其更亮*和**我需要一个我要调用NewBrightColor
的brightColor
,并传递颜色。所以,你可以
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)
。