Java使用lambda且未显式指明lambda类型时,调用参数为callable与runnable的重载函数时可能存在坑,例子如下,基于jdk-11.0.1
1
2
3
4
5
6
7
8
9
10
11
12static 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。