我对为什么没有lambda重载这样的东西有点困惑。
我知道 lambda 表达式适用于@FunctionalInterface
如果接口中有两个或多个抽象方法,则编译器无法决定在使用 lambda 表达式时调用哪个函数,因此如果要使用 lambda 表达式,则必须在接口中只有一个抽象方法。但是,如果您有两个或多个具有不同参数或不同类型的参数或返回类型的函数,编译器可以轻松决定调用哪个函数。
例如:
interface Foo{
void show(String message);
void count(int number);
}
// Calling with lambda (Syntax is not correct)
x -> "Example Message"; // It should need to call void show();
x -> 7; // It should need to call void count();
为什么这种东西在Java中不可用,这不是一件好事吗?
您已经考虑了问题的一方面 - lambda 表达式应该对应于哪个方法。您没有考虑的是界面中的所有其他方法会发生什么。
可以指定语言,以便 lambda 表达式对应于一种方法,而所有其他方法都抛出RuntimeException
- 但这很少有用。考虑如何使用Foo
。你最终会得到一个只能调用某些方法的对象,你甚至不知道可以安全地调用哪些方法。
如果你知道你只会调用一个方法(例如 count
在您的示例中),那么这是一个独立的功能,可以单独封装在接口中 - 此时现有的 lambda 表达式功能就可以了。如果您不知道自己只想使用一种方法,那么您的建议无论如何都无济于事。