2 回答

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

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊
Lambda 表達(dá)式被轉(zhuǎn)換為實(shí)現(xiàn)函數(shù)式接口的類的實(shí)例?!昂瘮?shù)式接口”是指其中僅包含 1 個(gè)(非默認(rèn))方法的接口。
String 不是一個(gè)接口 - 它是一個(gè)類。因此,編譯器查看 lambda 表達(dá)式,并知道如果代碼有意義,那么它應(yīng)該將 lambda 轉(zhuǎn)換為 Runnable 實(shí)現(xiàn)的實(shí)例,因?yàn)檫@是唯一可能起作用的東西!
添加回答
舉報(bào)