Я изучаю Kotlin для Android. Я использую класс данных. Я пытаюсь использовать компонентные функции класса данных. Я заметил, что я получаю компонентные функции для переменной только в том случае, если переменная имеет тип «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() {


    }
}

Итак, мой вопрос, пожалуйста, дайте мне знать, правильно ли я понимаю? Если да, то почему, потому что очень легко получить доступ к функциям компонентов, если количество параметров меньше.

Спасибо :)

3
Pritish 24 Сен 2018 в 11:45

2 ответа

Лучший ответ

Это забавная ошибка из-за студии Android. Я не знаю, как это описать. Но когда я использую var и сначала нажимаю alt + tab, он не дает никакой опции для функции component () среди списка. Затем я отфильтровываю его с помощью «comp», в нем отображаются только 2 параметра, такие как copy () и хэш-код, но по-прежнему нет параметра компонента, его только когда я пишу все слово «компонент», он удаляет все предыдущие параметры и показывает только компонент (), но не более ранние. То же самое, когда я использую val :) :) :)

1
Pritish 24 Сен 2018 в 09:21

Следующее должно работать:

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. Возможно, чего-то не хватает, вы пропустили свой собственный класс данных, возможно, там что-то не так.

0
Adam 24 Сен 2018 в 09:02