我无法从 Kotlin 中的嵌套 class 访问任何 class 成员

I can't reach any class member from a nested class in Kotlin

我想从 PersonAdapter class 访问 MainFragment class 的成员,但其中 none 可用。我尝试将 classes 和成员 public 设为私有,但到目前为止没有任何效果。 我想我错过了一些明显的东西,但我就是想不通。

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)
        }
    }}

在 Kotlin 中,嵌套 classes 默认无法访问外部 class 实例,就像嵌套 static classes 不能在 Java.[=16 中一样=]

为此,将 inner 修饰符添加到嵌套的 class:

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

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

请注意,inner class 持有对其包含的 class 实例的引用,这可能会影响后者的生命周期,如果 inner class 实例全局存储。

参见:Nested classes 语言参考

在 Kotlin 中,有 2 种嵌套 classes。

  1. 嵌套Class
  2. 内Class

不允许嵌套class访问外部class的成员。

如果你想在嵌套class中访问外部class的成员,那么你需要将嵌套class定义为内部class。

class OuterClass{

    var name="john"

    inner class InnerClass{

       //....
    }

}
  • 添加inner
  • 请注意,Android Studio 的代码完成 (IntelliSense) 在内部 class
  • 中不起作用
class OuterClass {
    val outerVariable = "Hello, World!"

    inner class InnerClass {
        // Code completion doesn't work here

        val innerVariable = outerVariable // Code completion work

        fun innerFunction() {
            // Code completion work
        }
    }
}