@FunctionalInterface继承

时间:2017-11-07 23:13:00

标签: java java-8 functional-interface

说我有以下界面:

@FunctionalInterface
public interface First {
   int fun(int a);
}

以及

@FunctionalInterface
public interface Second extends First {
   default int fun(int a) { fun(a, a); }

   int fun(int a, int b);
}

然后,如果我有一个方法,我可以做First,例如:

methodThatTakeFirst(val -> val + 1);

但我也希望能够传递Second,例如:

methodThatTakeFirst((v1, v2) -> v2 * v2);

然而,这只有在我像这样投射lambda时才有效:

methodThatTakeFirst((Second) (v1, v2) -> v2 * v2);

我的问题是:有没有办法设计这个模式而不必将lambda传播到子接口?或者处理这种情况的最优雅的方法是什么?

2 个答案:

答案 0 :(得分:0)

您可以重载methodThatTakeFirst,以便它还接受Second的实例作为参数,委托methodThatTakeFirst(First first)

void methodThatTakeFirst(First first) {
    // play with first
}

void methodThatTakeFirst(Second second) {
    methodThatTakeFirst((First) second); // casting necessary
}

强制转换是至关重要的,因此编译器实际上委托给methodThatTakeFirst(First first),否则你最终会得到StackOverflowError

这是否是一个好的设计,我不知道,但我认为这超出了这个问题的范围。

答案 1 :(得分:0)

也许只是添加另一个lambda?

  void secondMethod(Second second) {
      methodThatTakeFirst(x-> second.fun(x,x)); 
  }