错误不兼容类型:无法理解函数<;R、 T>;在java8中

错误不兼容类型:无法理解函数<;R、 T>;在java8中,java,java-8,Java,Java 8,在下面的示例代码中,我无法理解它为什么抱怨不兼容类型:对于案例II无效的方法引用,但对于案例I无效。尽管java.awt.Color::brighter和NewBrightColor::brightColor具有类似的方法签名 public static void main(String[] args) { // CASE I Function<Color, Color> brighter = Color::brighter; //

在下面的示例代码中,我无法理解它为什么抱怨
不兼容类型:对于
案例II
无效的方法引用
,但对于
案例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
    }
}
publicstaticvoidmain(字符串[]args){
//案例一
功能更亮=颜色::更亮;
//案例二
函数newBrighter=NewBrightColor::brightColor;
}
类NewBrightColor{
公共颜色brightColor(){
//返回一些明亮的颜色
}
}
编辑:

我从演示文稿中选取了这个示例

根据我的理解,
函数
应该只使用那些输入为
R
而输出为
T
的函数。但是在
案例I
中它不是真的(
函数要求输入颜色,但
brighter()
的输入无效),但是仍然没有编译错误,但是在
案例II
中它抛出编译问题。

Color\brighter()
不是arg方法,而
函数
需要
颜色
参数-
应用(颜色)

编辑

下面的示例显示了实例静态方法引用之间的差异

Function<Color, Color> newBrighter = NewBrightColor::brightColor; 
由于没有错误,它必须在传递给给定函数i的对象上调用引用的方法
Color#brighter()
。e<代码>颜色.绿色

编辑

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

  • 对特定对象的实例方法的引用
  • 对对象的任意对象的实例方法的引用 特定类型
第一个的行为与预期的一样。下面是对第二个的描述:

对于对任意对象的实例方法的引用,类型 方法所属的位于分隔符之前,并且 调用的接收器是函数的第一个参数 接口方法:

函数upperfier=String::toUpperCase

这里,隐式lambda表达式有一个参数,即 将转换为大写,它将成为 调用toUpperCase()方法

有关更多详细信息,请参阅,

泛化

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

编辑

Function brighter=Color::brighter;//c->c.c(c);
类似帖子的链接

Color#brighter()
不是参数方法,而
函数
需要
颜色
参数-
应用(颜色)

编辑

下面的示例显示了实例静态方法引用之间的差异

Function<Color, Color> newBrighter = NewBrightColor::brightColor; 
由于没有错误,它必须在传递给给定函数i的对象上调用引用的方法
Color#brighter()
。e<代码>颜色.绿色

编辑

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

  • 对特定对象的实例方法的引用
  • 对对象的任意对象的实例方法的引用 特定类型
第一个的行为与预期的一样。下面是对第二个的描述:

对于对任意对象的实例方法的引用,类型 方法所属的位于分隔符之前,并且 调用的接收器是函数的第一个参数 接口方法:

函数upperfier=String::toUpperCase

这里,隐式lambda表达式有一个参数,即 将转换为大写,它将成为 调用toUpperCase()方法

有关更多详细信息,请参阅,

泛化

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

编辑

Function brighter=Color::brighter;//c->c.c(c);
类似帖子的链接


查看
颜色的签名。颜色越亮

public Color brighter();
现在看看您的方法参考:

Function<Color, Color> brighter = Color::brighter;
看看函数引用

Function<Color, Color> newBrighter = NewBrightColor::brightColor; 
这将在调用
newBrighter.apply(brighter,color)
时调用
brighter.brightColor(color)

2) 在
NewBrighter
的实例上定义
函数

NewBrighter nb = //somehow get an instance
Function<Color, Color> newBrighter = nb::brightColor;
NewBrighter nb=//以某种方式获取一个实例
函数newBrighter=nb::brightColor;

这将在调用
newBrighter.apply(color)
时调用
nb.brightColor(color)
查看
color.brighter的签名

public Color brighter();
现在看看您的方法参考:

Function<Color, Color> brighter = Color::brighter;
看看函数引用

Function<Color, Color> newBrighter = NewBrightColor::brightColor; 
这将在调用
newBrighter.apply(brighter,color)
时调用
brighter.brightColor(color)

2) 在
NewBrighter
的实例上定义
函数

NewBrighter nb = //somehow get an instance
Function<Color, Color> newBrighter = nb::brightColor;
NewBrighter nb=//以某种方式获取一个实例
函数newBrighter=nb::brightColor;

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

但是如果我没有收到任何投诉,请检查,我已经更新了问题,这是我的错,你完全明白我的意思了。它不符合函数的定义。@subbashkumarsingh我将尝试为它找到答案this@subhashkumarsingh看看我的最新答案,希望能有所帮助。但万一我没有收到任何投诉。请