说我有以下界面:
@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传播到子接口?或者处理这种情况的最优雅的方法是什么?
答案 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));
}