1.首先能夠用於lambda表達式的只能是interface,並且interface 中只有一個方法。
這就說明,只要找到接口類型就能確定用的是哪個方法。(如下:intTypeInterface、StringTypeInterface、paramInterface)
2.判斷用的哪個接口,通過調用的方法就能確定(如:Test. invoke())
這里有兩種情況
#1.第一種
調用的方法名稱唯一,沒有重載(overload,方法同名,參數個數和類型不同)
這種情況下直接可以通過方法需要的參數類型即可判斷是哪個接口
如示例中只有一個invoke 方法 void invoke(intTypeInterface a), 即可判斷用的是 intTypeInterface。
#1.第二種
調用的方法名稱不唯一,有重載(overload,方法同名,參數個數和類型不同)
這種情況下需要通過invoke方法調用時,lambda表達式中的參數和返回值確定用的是哪個invoke方法。
比如:test.invoke( () -> 1 );
確定參數為空,返回值為int類型
在intTypeInterface、StringTypeInterface、paramInterface中, intTypeInterface 中的test 方法滿足條件
確定調用的是invoke(intTypeInterface a)方法
示例
//下面定義兩個functional interface
interface intTypeInterface { int test(); }
interface StringTypeInterface { String test(); }
interface paramInterface { String test(String param); }
class Test {
//兩個同名不同參數不同返回類型的函數
//函數返回int類型的接口
void invoke(intTypeInterface a) { System.out.println("intType"); }
//函數返回String類型的接口
void invoke(StringTypeInterface b) { System.out.println("StringType");}
//函數返回String類型,但是有兩個參數的接口
void invoke(paramInterface b) { System.out.println("param");}
//***如果調用invoke函數會調用哪一個?***//
public static void main(String[] args) {
Test test = new Test();
//根據 1 返回類型得知應實例化intTypeInterface接口
test.invoke( () -> 1 );
//根據 "String" 返回類型得知應實例化StringTypeInterface接口
test.invoke( () -> "String" );
//根據函數參數得知應實例化paramInterface接口
test.invoke( (String s) -> "String" );
}