Многофункциональный ArrayList в качестве аргумента функции в Kotlin - PullRequest
0 голосов
/ 24 апреля 2020

Я хочу отправить в массив список массива, содержащий несколько типов (я знаю, что это не очень хорошая практика, это специально).

Я не знаю, какой тип использовать для аргумент «числа» функции. А потом, как это перебрать. Я попробовал List, но для этого нужно.

Спасибо.

fun sum(numbers : ArrayList) : Double
{
    var sum:Double = 0.0

    for(i in 0 until numbers.itemCount)
    {
        var temp:Double = numbers.getItem(i).toDouble()
        sum = sum + temp
    }

    return sum
}

fun main()
{
    var ar = listOf("99", 1, 3.1)

    println(sum(ar))
}

1 Ответ

2 голосов
/ 24 апреля 2020

Вы не можете сделать это без проверки определенных c типов. String.toDouble() - это не та же функция, что и Number.toDouble(), даже если они выглядят одинаково. Ваш тип ArrayList должен быть Any, чтобы можно было принимать значения String s и Number s. Затем вы должны явно проверить тип. Вам придется обрабатывать случай, когда что-то не является String или Number, выдавая исключение.

Вы могли бы также сделать тип List<Any> вместо ArrayList<Any>, чтобы избежать ненужных ограничений на ввод.

fun sum(numbers : List<Any>) : Double
{
    var sum: Double = 0.0

    for(item in numbers) {
        val temp = when (item) {
            is String -> item.toDouble()
            is Number -> item.toDouble()
            else -> error("Unsupported type")
        }
        sum += temp
    }

    return sum
}

Существует существующая функция sumBy() для списков, поэтому вы можете упростить этот код:

fun sum(numbers : List<Any>) : Double = numbers.sumBy {
    when (it) {
        is String -> it.toDouble()
        is Number -> it.toDouble()
        else -> error("Unsupported type")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...