3 回答
TA贡献1816条经验 获得超6个赞
问题
该方法grow
不接受任何参数,因此出现编译错误。
解释
lambda() -> System.out.println("This from Lambda expression")
本身可以代表一个Plant
(不是Eucalyptus
*)实例:
Plant plant = () -> System.out.println("This from Lambda expression");
尝试从
Plant
接口创建 lambda 表达式并通过 print覆盖grow()
方法"This was running from Lambda expression"
。
这里有一个小小的误会。一个 lambda 不应该覆盖一个方法,它取决于提供一个基于@FunctionalInterface
类型的方法。
*如果您要Eucalyptus
通过 lambda定义一个对象,那么 lambda 将代表什么方法将是模棱两可的并且不清楚。因此,它是被禁止的(即使对于具有单个抽象方法的抽象类。)
TA贡献1757条经验 获得超7个赞
不同之处在于您试图覆盖Eucalyptus实现接口的类的实现。
Eucalyptus eucalyptus1 = new Eucalyptus();
eucalyptus1.grow(() -> System.out.println("This from Lambda expression"));
^__ // you cannot override a method using an instance of a class which is just an implementation of the interface
您最终要做的就是传递一个 lambda 参数,当然,如果在方法调用时提供了一个参数,则定义中没有参数的方法将无法编译。
相反,您可以将实现 lambda 的方式比较为:
//Anonymous class Myrtle from Plant interface
Plant myrtle = new Plant() {
@Override
public void grow() {
System.out.println("This was running from anonymous class from Plant Interface");
}
};
myrtle.grow();
可以表示为 lambda 表示:
Plant lambdaRep = () -> System.out.println("This is running via lambda from Plant Interface");
lambdaRep.grow();
TA贡献1815条经验 获得超13个赞
您在这里使用 lambda 表达式是不正确的。
您可以使用 lambda 表达式来实现接口。在这种情况下,您将提供Plant使用 lambda 表达式的实现,而不是使用 lambda 表达式调用该接口的方法:
这是一个正常的使用:
Plant eucalyptus1 = () -> System.out.println("This from Lambda expression");
eucalyptus1.grow(); // Prints "This from Lambda expression"
换句话说,因为你有一个函数式接口,你应该能够避免创建实现它的类(匿名与否)。
所以你根本不需要创建这个Eucalyptus类。
添加回答
举报