Я не могу связаться с членом класса из вложенного класса в Котлин

Я хочу получить доступ к классу MainFragment из класса PersonAdapter, но ни один из них не доступен. Я попробовал сделать и классы, и члены публичными и частными, но пока ничего не получилось. Наверное, мне не хватает чего-то очевидного, но я просто не могу понять.

class MainFragment : Fragment() {
    lateinit var personAdapter: PersonAdapter
    lateinit var personListener: OnPersonSelected
    private var realm: Realm by Delegates.notNull()
    lateinit var realmListener: RealmChangeListener<Realm>

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val v = inflater.inflate(R.layout.fragment_main, container, false)
        return v
    }

    class PersonAdapter() : RecyclerView.Adapter<ViewHolder>() {
        var localPersonList = personList

        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            holder.bindItems(localPersonList[position])

            holder.itemView.setOnClickListener {
                Toast.makeText(context, "click", Toast.LENGTH_SHORT).show()
                //I want to reach personListener from here
            }
        }

        override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
            val v = LayoutInflater.from(parent!!.context).inflate(R.layout.person_list_item, parent, false)
            return ViewHolder(v)
        }
    }}

Ответ 1

В Kotlin вложенные классы не могут обращаться к экземпляру внешнего класса по умолчанию, как вложенные static class es в Java.

Для этого добавьте модификатор inner вложенный класс:

class MainFragment : Fragment() {
    // ...

    inner class PersonAdapter() : RecyclerView.Adapter<ViewHolder>() {
        // ...
    }
}

Смотрите: Вложенные классы в справочной системе языка

Ответ 2

В Kotlin существует 2 типа вложенных классов.

  • Вложенный класс
  • внутренний класс

Вложенному классу не разрешается обращаться к члену внешнего класса.

Если вы хотите получить доступ к члену внешнего класса во вложенном классе, вам необходимо определить этот вложенный класс как внутренний класс.

class OuterClass{

    var name="john"

    inner class InnerClass{

       //....
    }

}