Java使用lambda调用参数为callable或runnable的重载函数时可能存在坑

Java使用lambda且未显式指明lambda类型时,调用参数为callable与runnable的重载函数时可能存在坑,例子如下,基于jdk-11.0.1

1
2
3
4
5
6
7
8
9
10
11
12
static int b(Callable<?> c) {
return 10;
}

static void b(Runnable r) {
}

public static void main(String[] args) {
b(() -> {
throw new RuntimeException();
});
}

如果没有int b(Callable<?> c)函数,那么肯定是调用void b(Runnable r)函数,而如果有int b(Callable<?> c)函数,默认是调用int b(Callable<?> c)函数。
从而如果一个lib第一版只有runnable的版本,并且第二版增加了callable的版本,而客户在第一版时这样去使用,就会导致,客户升级版本时,很难得知所调用的函数发生了变化,从而容易导致bug。