为什么在 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
}
根据 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
}