[英]Java why can't I use multiple inheritance with functional interfaces
我当时正在为Java创建一个小型库,而api的一部分是一个带有3个参数的功能接口(因此是lambda表达式)。 我意识到其中两个可能经常是多余的。 所以我想做这样的事情:
class Main {
public static void main(String[] args) {
call((s) -> System.out.println(s));
}
static void call(A a) {
a.call(7, 42, "Hello World!");
}
static interface A {
void call(int x, int y, String s);
}
static interface B extends A {
void call(String s);
default void call(int x, int y, String s) {
call(s);
}
}
}
我希望用户然后可以根据需要插入前两个参数,但是如果不这样做,则可以将其省略而将其忽略。 但是,当我尝试编译以上代码时,出现了编译时异常消息,消息为“不兼容的类型:lambda表达式中的参数类型不兼容”。 为什么这不起作用?
您的static void call(A a)
方法需要一个类型为A
的参数,或者是一个满足您在其上定义的SAM方法签名的lambda表达式。 这就是为什么它会抱怨您实际上只是在传递3时才传递1参数。如果要传递类型B
的Lambda表达式,则必须首先将其强制转换为:
call((B)(s) -> System.out.println(s));
或者,您可以编辑您的static void call
方法以接受类型B
的参数。
方法call(A a)
以接口A
实例作为参数,而在接口A
,方法调用采用3个参数: void call(int x, int y, String s);
所以看起来您想将参数声明为接口B
的实例-而不是A
所以修改:
static void call(A a) {
a.call(7, 42, "Hello World!");
}
至:
static void call(B b) {
b.call(7, 42, "Hello World!");
}
将解决问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.