#kotlin #lambda #interface #this #sam
#котлин #лямбда #интерфейс #это #сэм
Вопрос:
У меня есть следующий интерфейс (SAM):
fun interface WebResponseHandler
{
fun onWebResponseFinished(jsonString:String?)
}
и внутри класса (давайте назовем класс ClassA) я написал следующий код:
private val onInitWebResponseHandler: VolleyHandler.WebResponseHandler = VolleyHandler.WebResponseHandler()
{
Thread(ParseJsonStringOnInit(WeakReference(this),
weakRefIOnAllScoresDataFirstFetched, it)).start()
}
я не могу понять, почему в первом аргументе ParseJsonStringOnInit это рассматривается как ClassA, а не как VolleyHandler .WebResponseHandler?
Является ли это условностью при использовании SAM?
Комментарии:
1. Почему вы этого ожидаете? в конце концов, это всего лишь синтаксический сахар для создания класса, который реализует интерфейс и не имеет ничего общего с SAM.
2. У лямбд нет параметра a
this
, если нет параметра receiver . Если вам нужно обратиться к анонимному классу, вы не можете использовать лямбда-синтаксис.3. Итак, на что
this
же ссылаться в этой ситуации? Поскольку код компилируется и в соответствии с тем, что я вижу (не уверен), он ссылается на класс, который содержит этот фрагмент кода4. Он ссылается на ближайшую допустимую область, содержащую область, которая будет классом, в котором определено это свойство. Вы можете щелкнуть по нему ctrl , и IDE переместит курсор на то, к чему он относится.
5. @Tenfour04, в SAM у лямбда-выражения никогда не будет получателя. Я прав?