我看到單參數構造函數Thread()同時采用Runnable和。String編譯器如何知道 alambda正在實現一個Runnable類而不是一個String類? (new Thread( () -> {
System.out.println("Deleting stats...");
})).start();也許它取決于類/接口中方法的數量?但是,如果一個類有多個構造函數,這些構造函數采用只有一個方法的單個參數類,例如:Thread( Runnable r );
Thread( Comparable c );
Thread( ActionListener al );當你嘗試實現lambdathen 時會發生什么?編譯器如何知道正在lambda實現哪個類?
2 回答

三國紛爭
TA貢獻1804條經驗 獲得超7個贊
Java 編譯器必須為 lambda 表達式的類型選擇函數接口類型。這受JLS 第 15.27.3 條管轄,其中規定:
如果 T 是函數接口類型(第 9.8 節)并且表達式與從 T 派生的基本目標類型的函數類型一致,則 lambda 表達式在賦值上下文、調用上下文或轉換上下文中與目標類型T兼容。
該類型String
不是函數式接口類型,但Runnable
確實是。lambda 不接受參數也不返回數據,因此它與一致Runnable
。
更一般地,lambda 表達式中的參數類型必須與函數接口類型的單個抽象方法的參數類型匹配,并且返回類型也必須匹配。
在您的示例中,3 種功能接口類型中的每一種都是不同的,因此最多有一種會匹配。如果有多個可能匹配的函數接口類型,那么這將是不明確的,只能通過將 lambda 表達式轉換為預期的函數接口類型來解決。

翻過高山走不出你
TA貢獻1875條經驗 獲得超3個贊
Lambda 表達式被轉換為實現函數式接口的類的實例。“函數式接口”是指其中僅包含 1 個(非默認)方法的接口。
String 不是一個接口 - 它是一個類。因此,編譯器查看 lambda 表達式,并知道如果代碼有意義,那么它應該將 lambda 轉換為 Runnable 實現的實例,因為這是唯一可能起作用的東西!
添加回答
舉報
0/150
提交
取消