错误不兼容类型:无法理解java8中的函数<r,t>

时间:2017-04-28 11:50:14

标签: java java-8

在以下示例代码中,我无法理解为case II投诉case I而不是java.awt.Color::brighter投诉的原因。虽然NewBrightColor::brightColorpublic 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 } } 具有相似的方法签名。

Function<R,T>

编辑:

我从演示文稿https://youtu.be/e4MT_OguDKg?t=31m58s

中采用了这个例子

根据我的理解,R应仅采用输入为T且输出为case I的函数。但是在Function<Color, Color>中它不是真的(brighter()期望Color作为输入但是case II输入void),但仍然没有编译错误但是在{{1}}它会抛出编译问题

2 个答案:

答案 0 :(得分:3)

查看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我要打{{1​​}} ,传递颜色。

所以,你可以

1)使用brightColor

传递实例
BiFunction

这将在致电BiFunction<NewBrightColor, Color, Color> newBrighter = NewBrightColor::brightColor 时致电newBrighter.apply(brighter, color)

2)在brighter.brightColor(color)的实例上定义Function

NewBrighter

这将在致电NewBrighter nb = //somehow get an instance Function<Color, Color> newBrighter = nb::brightColor; 时致电newBrighter.apply(color)

答案 1 :(得分:2)

justify-content-center是非参数方法,而Color#brighter()需要Function<Color,Color>参数 - Color

修改

以下示例显示了实例静态 方法参考

之间的区别
apply(Color)

那么为什么将实例no-arg 方法public static void main(String[] args) { MyColor c = new MyColor(); Function<Color, Color> brighterInstance = c::brighterInstanceMethod; // OK Function<Color, Color> brighterStatic = MyColor::brighterStaticMethod; // OK // CASE II - trying to assign instance method via static context Function<Color, Color> brighter = MyColor::brighterInstanceMethod; // compilation error } static class MyColor { public Color brighterInstanceMethod(Color color) {return null;} public static Color brighterStaticMethod(Color color) {return null;} } 分配给Color#brighter()是合法的?

Function<Color,Color>

由于没有错误,它必须以某种方式在传入给定函数i的对象上调用引用的方法public static void main(String[] args) { // CASE I Function<Color, Color> brighter = Color::brighter; // surprisingly no error System.out.println(brighter.apply(Color.GREEN)); } 。即Color#brighter()

修改

实例 Method References 两种类型(不知道):

  • 引用特定对象的实例方法
  • 引用任意对象的实例方法 特殊类型

第一个表现得像预期的那样。以下是第二个的描述:

  

对于任意对象的实例方法的引用,类型   方法所属的分隔符和分隔符   调用的接收器是功能的第一个参数   界面方法:

     

Color.GREEN

     

这里,隐式lambda表达式有一个参数,即字符串to   转换为大写,成为接收者   调用toUpperCase()方法。

有关详细信息,请参阅State of the lambda - 8. Method referencesMethod References

<强> Sumarization

此类型的方法引用被翻译为“在函数的参数上调用引用的方法”

修改

Method reference to Function translation

Function<String, String> upperfier = String::toUpperCase;

指向类似帖子的链接

Method reference types