Вы не можете сделать это без проверки определенных 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")
}
}