为什么在 Kotlin 中创建 SAM 接口实例时需要在接口名称后加上括号?

Why do I need to put parenthesis after the name of the interface when creating an instance of a SAM interface in Kotlin?

根据 Kotlin's documentation on SAM Conversions,创建 SAM 接口实例的语法如下:

val runnable = Runnable { println("This runs in a runnable") }

可以看出接口名称Runnable后面没有括号

尽管如此,当我尝试像这样创建 OnRatingBarChangeListener interface 的实例时:

customRatingBar.onRatingBarChangeListener = OnRatingBarChangeListener
    {ratingBar: RatingBar, rating: Float, _: Boolean -> if (rating < 0.5f) ratingBar.rating = 0.5f}

Android Studio 在 OnRatingBarChangeListener 下方放置了一条红色波浪形下划线,并表示:“预期函数调用 'OnRatingBarChangeListener(...)'”。实际上,将括号放在 OnRatingBarChangeListener 之后,错误不再出现,我的应用程序运行正常:

customRatingBar.onRatingBarChangeListener = OnRatingBarChangeListener()
    {ratingBar: RatingBar, rating: Float, _: Boolean -> if (rating < 0.5f) ratingBar.rating = 0.5f}

无论如何,如果 Kotlin 的文档另有说明,我不明白为什么需要括号。

非常感谢您的帮助!

因为你在下一行开始了大括号,所以它不能判断 lambda 是第一个表达式的一部分。它将 lambda 解释为下一行的独立表达式。

顺便说一下,使用 SAM 转换更方便的方法是让您跳过编写接口名称:

customRatingBar.setOnRatingBarChangeListener { ratingBar, rating, _ -> 
    if (rating < 0.5f) ratingBar.rating = 0.5f
}