我刚刚学习了java 8的方法引用概念.我发现奇怪的是在没有实现接口的情况下将方法引用分配给接口变量的示例,并且调用接口的抽象方法是调用引用的方法.
interface Sayable {
void say();
}
public class InstanceMethodReference {
public void saySomething() {
System.out.println("Hello, this is non-static method.");
}
public static void main(String[] args) {
InstanceMethodReference methodReference = new InstanceMethodReference();
Sayable sayable = methodReference::saySomething;
sayable.say();
}
}
上面的代码打印了saySomething方法的消息,我试图理解如何在这里完成方法和对象的内存分配以及它的整体工作方式.
任何帮助赞赏.
解决方法:
这只是匿名实现的语法糖或带闭包的lambda(指定义之外的状态,在您的情况下是methodReference的实例).方法参考和lambdas在这方面同等对待.所以真的是相同的内存分配.
当接口只有一个非静态方法并且该方法的签名与lambda或方法引用的签名匹配时,可以使用方法引用(或lambdas).在这种情况下,编译器将知道如何包装它,因此它将是可分配的.如果它是“标准”接口之一,如功能,消费者或供应商或自定义接口,则无关紧要,它应该是一个功能界面.
Arrays.sort(rosterAsArray, Person::compareByAge);
方法引用Person :: compareByAge在语义上与lambda表达式(a,b)相同 – > Person.compareByAge(a,b).每个都有以下特点:
>其形式参数列表是从Comparator.compare复制的,即(Person,Person).
>它的主体调用方法Person.compareByAge.
标签:java,object,interface,functional-programming
来源: https://codeday.me/bug/20190527/1162156.html