可以做类似这样的事情吗:
boolean isItMyMethod( Consumer<Object> aConsumer )
{
return aConsumer.equals( this::myMethod );
}
这段代码无法编译通过。如果我将this::myMethod赋值给一个中间变量,它就可以编译通过了,但结果总是false。
Object ob = x -> Sysout(x);
Consumer<Object> consumer = x -> Sysout(x);
您已经给Lambda分配了具体的含义,然后它可以被分配给任何超类型引用。
Object ob = consumer;
equals()
方法返回false
,你可以猜测一下。由于Lambda是在运行时构造的类实例,它将提供FI中抽象方法的实现,那么你希望两个Consumer
引用基于什么进行比较呢?由于没有重写equals()
方法,它将调用Object
类中的实现,该实现只比较引用。实现看起来像这样:public boolean equals(Object ob) {
return this == ob;
}
aConsumer == bConsumer
将返回 false
。aConsumer == bConsumer
可能会返回false
。 - Holgerequals()
方法? - Basilevs
Object
不是。 - Rohit Jain.equals
在lambda表达式或方法引用上返回一致的结果。 - Jeffrey BosboomConsumer<Object> c1=this::myMethod, c2=this::myMethod;
并且c1==c2
或c1.equals(c2)
都将评估为false
。因此,您可以修复代码以aConsumer.equals((Consumer<Object>) this::myMethod )
,但它始终会产生false
(使用当前的JRE实现)。请参见https://dev59.com/E14c5IYBdhLWcg3wM3-R。 - Holger