В Kotlin, как проверить, что List <Any>содержит тот или иной класс данных? - PullRequest
0 голосов
/ 05 мая 2019

У меня есть два класса данных

    data class Card(val code: String?, val caption: String?, val icon: String?)
    data class Currency(val code: String?, val caption: String?, val descr: String?)

, которые организованы в списки: List<Card> and List<Currency>, которые я использую в качестве параметров при вызове одной функции. Тип параметра определяется как List<Any>. Как внутри класса или функции я могу определить тип данных? Это список Карты или Список Валюты?

Это приложение для Android на Kotlin

class SpinnerAdapter(val context: Context, var name: List<Any>): BaseAdapter() {
    init {
        if (name.contains(Card)) { //is list of Card?

        }
    }
    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
   ...

Ответы [ 2 ]

3 голосов
/ 05 мая 2019

Я думаю, вы можете использовать классную функцию, которую предоставляет kotlin. например:

class SpinnerAdapter(var name: List<Any>) {
init {
    when(name.first()){
        is Card -> {
            //  do something
        }

        is Currency -> {
            //  do something
        }

        else -> // do something
    }
}

}

это решение полагается на то, что в списке любого может быть либо вся карта, либо вся валюта. если список может содержать смешанные элементы, вы должны запустить цикл for и позволить блоку when решить поток.

0 голосов
/ 06 мая 2019

Ответ от Amazia работает, но вы можете улучшить его, внедрив запечатанный класс, например:

sealed class PaymentMethod {
    abstract val code: String?
    abstract val caption: String?

    data class Card(override val code: String?, override val caption: String?, val icon: String?) : PaymentMethod
    data class Currency(override val code: String?, override val caption: String?, val descr: String?) : PaymentMethod
}

Больше информации о закрытых классах в Котлине: https://kotlinlang.org/docs/reference/sealed-classes.html

это позволяет вам сделать исчерпывающую оговорку над списком методов оплаты следующим образом (нет необходимости в другой ветке):

class SpinnerAdapter(var name: List<PaymentMethod>) {
init {
    when(name.first()){
        is Card -> {
            //  do something
        }

        is Currency -> {
            //  do something
        }
    }
}

Вы также можете использовать это исчерпывающее значение в потоке, если хотите:

class SpinnerAdapter(var name: List<PaymentMethod>) {
init {
    name.map{ 
        when(name.first()){
            is Card -> {
                //  do something
            }
            is Currency -> {
                //  do something
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...