我正在为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表达式中的不兼容参数类型"。为什么这不起作用?
答案 0 :(得分:1)
您的static void call(A a)
方法需要类型为A
的参数,或者满足您在其上定义的SAM method签名的lambda表达式。这就是为什么它会抱怨你只是在实际期望3时传递1个参数的原因。如果你想传递类型为B
的lambda表达式,你必须首先将其转换为:
call((B)(s) -> System.out.println(s));
或者您可以修改static void call
方法以接受B
类型的参数。
答案 1 :(得分:1)
方法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!");
}
将解决问题