【发布时间】:2019-02-28 01:13:10
【问题描述】:
所以我熟悉 java 中的函数式接口,以及它们与 lambda 表达式的使用。一个函数式接口只能包含一个抽象方法。在 lambda 表达式中使用这个单独的方法时,您不需要指定它的名称 - 因为接口中只有一个抽象方法,编译器知道这是您引用的方法。
例子:
// Functional Interface:
@FunctionalInterface
public interface Ball
{
void hit();
}
// Lambda to define, then run the hit method:
Ball b = () -> System.out.println("You hit it!");
b.hit();
虽然很明显为什么一个函数式接口只能包含一个抽象方法,但我不明白为什么不能重载该方法。
例如,以下将无法编译:
// (NOT) Functional Interface:
@FunctionalInterface
public interface Ball
{
void hit();
void hit(boolean miss);
}
// Lambda to define, then run the hit method:
Ball b = () -> System.out.println("You hit it!");
Ball ba = (boolean miss) -> System.out.println(miss);
b.hit();
ba.hit(false);
编译器指出Ball 接口不起作用,因为它包含多个方法,但在这种情况下,我不明白为什么会出现问题 - 只要这两种方法采用不同的参数,它应该可以根据我定义的参数推断我在 lambda 中引用的方法。
谁能解释为什么不能在函数式接口中重载抽象方法?
【问题讨论】:
-
因为如果你这样做,现在有两个抽象方法,而一个函数式接口必须有正好一个抽象方法。重载的方法彼此完全不同,它们只是碰巧共享一个名称。
-
他们可以被区分。它们是不同的。因此它们是不同的。不一样。不止一个,违反了功能接口的“完全一个”要求。
-
两个重载的方法需要两个方法体(实现)。函数式接口必须是可以完全使用单个方法体实现的接口,然后可以使用 Lambda 语法或方法引用语法来实现。
-
“您尝试从 lambda 引用哪个”。你完全没有抓住重点。这不是关于使用(又名引用)接口。它是关于实现接口的。见我的previous comment。
-
@Andreas - 天哪。你是对的,我想我有点忘了 lambda 表达式实际上在做什么
标签: java oop overloading functional-interface