为什么只有val类型的对象在Kotlin中具有组件功能?

时间:2018-09-24 08:45:48

标签: android kotlin

我正在学习Android的Kotlin。我正在使用数据类。我正在尝试使用数据类的组件函数。我观察到的是,仅当变量的类型为“ val”且没有为“ var”时才获得变量的组件函数

  var customObj: CustomObj = CustomObj("Henlo", 5)
    mlist.add(customObj)
    for ((i, v) in mlist.withIndex()) {
        //print("In loop")
       // customObj.
        if(mlist.get(i) is CustomObj)
        println(mlist.get(i))
    }

对于上述对象customObj,我无法访问组件函数。

如果我将其更改为

  val customObj: CustomObj = CustomObj("Henlo", 5)
    mlist.add(customObj)
    for ((i, v) in mlist.withIndex()) {
        //print("In loop")
       // customObj.
        if(mlist.get(i) is CustomObj)
        println(mlist.get(i))
    }

我可以使用组件功能。

编辑:我正在发布完整的活动课程

class MainActivity : AppCompatActivity() {
    var mlist = mutableListOf<Any>()
    var mlistNew = mutableListOf<String>()
    //var i = Int
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        /*  val numbers: IntArray = intArrayOf(1, 2, 3, 4, 5)
          println("Hey!! I am array Example" + numbers[2])*/
        mlist.add("this")
        mlist.add("is")
        mlist.add("my")
        mlist.add("first")
        mlist.add("kotlin")
        mlist.add("sample")
        mlist.add(1)
        mlist.add(2)
        mlist.add(3)
        mlist.add(4)
        mlist.add(5)
        mlist.add(CustomObj("my", 2))
        val customObj: CustomObj = CustomObj("Henlo", 5)
        mlist.add(customObj)
        for ((i, v) in mlist.withIndex()) {
            //print("In loop")
           // customObj.i
            if(mlist.get(i) is CustomObj)
            println(customObj.i)
        }
        //   mlist.get(0)
        for ((index, value) in mlistNew.withIndex()) {
            //   mlistNew.get(index)
        }
        mlistNew.add("one")
        mlistNew.add("two")

        // mlistNew.get(0)
    }

    private data class CustomObj(var i: String, var j: Int) : Any() {


    }
}

所以我的问题是,请问我是否理解正确? 如果是,为什么会这样,因为如果参数数量较少,访问组件函数非常容易。

谢谢:)

2 个答案:

答案 0 :(得分:1)

由于android studio,这是一个有趣的错误。我不知道如何形容。但是,当我使用var并最初按alt + tab时,列表中的component()函数不会提供任何选项。然后,我用“ comp”过滤它,仅显示两个选项,例如copy()和哈希码,但仍然没有组件选项,只有当我写了整个单词“ component”时,它才会删除所有较早的选项并仅显示component ()选项,而不是较早的选项。当我使用val :) :) :)

时,情况并非如此

答案 1 :(得分:0)

以下应该可以工作:

fun main(args: Array<String>) {

    var pair = Pair("hi", "there")
    //val pair = Pair("hi", "there") // is the same

    val (hi , _) = pair
    println(hi + " " + pair.component2())
}

在var或val中存储应该没有区别。也许缺少某些内容,您省略了自定义数据类,也许其中有错误。