亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

編譯器如何知道 lambda 正在實現哪個類?

編譯器如何知道 lambda 正在實現哪個類?

Helenr 2023-11-10 17:06:07
我看到單參數構造函數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 表達式轉換為預期的函數接口類型來解決。


查看完整回答
反對 回復 2023-11-10
?
翻過高山走不出你

TA貢獻1875條經驗 獲得超3個贊

Lambda 表達式被轉換為實現函數式接口的類的實例。“函數式接口”是指其中僅包含 1 個(非默認)方法的接口。

String 不是一個接口 - 它是一個類。因此,編譯器查看 lambda 表達式,并知道如果代碼有意義,那么它應該將 lambda 轉換為 Runnable 實現的實例,因為這是唯一可能起作用的東西!


查看完整回答
反對 回復 2023-11-10
  • 2 回答
  • 0 關注
  • 181 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號