Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在Kotlin中创建SAM接口实例时,为什么需要在接口名称后加括号?_Android_Kotlin_Single Abstract Method_Object Expression - Fatal编程技术网

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

Android 在Kotlin中创建SAM接口实例时,为什么需要在接口名称后加括号?,android,kotlin,single-abstract-method,object-expression,Android,Kotlin,Single Abstract Method,Object Expression,根据,创建SAM接口实例的语法如下所示: val runnable = Runnable { println("This runs in a runnable") } customRatingBar.onRatingBarChangeListener = OnRatingBarChangeListener {ratingBar: RatingBar, rating: Float, _: Boolean -> if (rating < 0.5f) rati

根据,创建SAM接口实例的语法如下所示:

val runnable = Runnable { println("This runs in a runnable") }
customRatingBar.onRatingBarChangeListener = OnRatingBarChangeListener
    {ratingBar: RatingBar, rating: Float, _: Boolean -> if (rating < 0.5f) ratingBar.rating = 0.5f}
可以看出,接口名称
Runnable
后面没有括号

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

val runnable = Runnable { println("This runs in a runnable") }
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
}
customRatingBar.setOnRatingBarChangeListener{ratingBar,rating,->
如果(额定值<0.5f)额定值bar.rating=0.5f
}

这是因为您在下一行开始使用大括号,所以它无法判断lambda是否是第一个表达式的一部分。它将lambda解释为下一行的独立表达式

顺便说一句,使用SAM转换的更方便的方法将允许您跳过编写接口名称:

customRatingBar.setOnRatingBarChangeListener { ratingBar, rating, _ -> 
    if (rating < 0.5f) ratingBar.rating = 0.5f
}
customRatingBar.setOnRatingBarChangeListener{ratingBar,rating,->
如果(额定值<0.5f)额定值bar.rating=0.5f
}