amy*_*nbe 4 java lambda java-8
是否可以做类似的事情:
boolean isItMyMethod( Consumer<Object> aConsumer )
{
return aConsumer.equals( this::myMethod );
}
Run Code Online (Sandbox Code Playgroud)
这不能编译。如果我将 this::myMethod 分配给中间变量,它会起作用,但结果始终为 false。
方法引用或 lambda 的目标类型应该是函数式接口。由于equals()方法采用一个Object不是函数式接口的方法,因此无法编译。现在你会说,为什么?那么,lambda 表达式或方法引用在运行时被实现为实现该函数接口的类的实例。FI 仅包含一个抽象方法,因此对于 lambda x -> Sysout(x),左侧部分成为该方法的参数,右侧部分成为主体。
现在可以有很多功能接口,提供这样的方法签名。这意味着相同的 lambda 表达式可以编译为不同 FI 的实现。现在,当您将 lambda 传递给Object这样的引用时:
Object ob = x -> Sysout(x);
Run Code Online (Sandbox Code Playgroud)
您希望 JVM 实例化哪个 FI?这会导致一定的歧义,因此是不允许的。但是通过将 lambda 预先分配给 FI 引用:
Consumer<Object> consumer = x -> Sysout(x);
Run Code Online (Sandbox Code Playgroud)
您已经为 lambda 分配了具体的含义,稍后可以将其分配给其任何超类型引用。
Object ob = consumer;
Run Code Online (Sandbox Code Playgroud)
现在至于为什么equals()方法会返回false,你可以猜到了。由于 lambda 是在运行时构造的类的实例,它将提供 FI 中抽象方法的实现,因此您希望在什么基础上Consumer比较两个引用?由于没有equals()重写方法,它将调用类中的实现Object,该实现只是比较引用。实现看起来像这样:
public boolean equals(Object ob) {
return this == ob;
}
Run Code Online (Sandbox Code Playgroud)
如果两者都引用 2 个不同的 lambda/方法引用,那么肯定aConsumer == bConsumer会返回。false
| 归档时间: |
|
| 查看次数: |
3669 次 |
| 最近记录: |