Java为何不能在功能接口

时间:2017-08-29 02:02:21

标签: java lambda polymorphism

我正在为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表达式中的不兼容参数类型"。为什么这不起作用?

2 个答案:

答案 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!");
 }

将解决问题