кто это внутри лямбда-выражения при реализации SAM?

#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 у лямбда-выражения никогда не будет получателя. Я прав?