【问题标题】:I can't reach any class member from a nested class in Kotlin我无法从 Kotlin 的嵌套类中联系到任何类成员
【发布时间】:2018-01-07 03:53:17
【问题描述】:

我想从 PersonAdapter 类访问 MainFragment 类的成员,但它们都不可用。我尝试将课程和成员都设为公开和私有,但到目前为止没有任何效果。 我想我错过了一些明显的东西,但我就是想不通。

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

【问题讨论】:

    标签: class kotlin scope member


    【解决方案1】:
    • 添加inner
    • 请注意,Android Studio 的代码完成 (IntelliSense) 不能在内部类中正常工作
    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
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      在 Kotlin 中,嵌套类默认不能访问外部类实例,就像嵌套的 static classes 在 Java 中不能一样。

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

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

      请注意,inner 类包含对其包含类实例的引用,这可能会影响后者的生命周期,并且如果 inner 类实例被全局存储,则可能导致内存泄漏。

      请参阅:语言参考中的Nested classes

      【讨论】:

        【解决方案3】:

        在 Kotlin 中,嵌套类有两种类型。

        1. 嵌套类
        2. 内部类

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

        如果要在嵌套类中访问外部类的成员,则需要将该嵌套类定义为内部类。

        class OuterClass{
        
            var name="john"
        
            inner class InnerClass{
        
               //....
            }
        
        }
        

        【讨论】:

        • 要访问内部类中的父类,使用this@OuterClass
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多