Kotlin中作为函数参数的多类型ArrayList

Kotlin中作为函数参数的多类型ArrayList,kotlin,collections,Kotlin,Collections,我想向一个函数发送一个包含多种类型的数组列表(我知道这不是一个好的做法,这是故意的) 我不知道函数的'numbers'参数应该使用什么类型。然后是如何迭代它。我试过列表,但需要一个 谢谢 fun sum(numbers : ArrayList) : Double { var sum:Double = 0.0 for(i in 0 until numbers.itemCount) { var temp:Double = numbers.getItem(i)

我想向一个函数发送一个包含多种类型的数组列表(我知道这不是一个好的做法,这是故意的)

我不知道函数的'numbers'参数应该使用什么类型。然后是如何迭代它。我试过列表,但需要一个

谢谢

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))
}

如果不检查特定类型,则无法执行此操作
String.toDouble()
Number.toDouble()
的函数不同,即使它们看起来相同。您的
ArrayList
类型必须是
Any
,才能同时接受
String
s和
Number
s。然后必须显式检查类型。您必须通过抛出异常来处理非字符串或数字的情况

您还可以将类型设置为
List
而不是
ArrayList
,以避免对输入进行不必要的限制

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
}

如果不检查特定类型,则无法执行此操作
String.toDouble()
Number.toDouble()
的函数不同,即使它们看起来相同。您的
ArrayList
类型必须是
Any
,才能同时接受
String
s和
Number
s。然后必须显式检查类型。您必须通过抛出异常来处理非字符串或数字的情况

您还可以将类型设置为
List
而不是
ArrayList
,以避免对输入进行不必要的限制

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
}

如果希望列表包含任何对象,可以使用
List
。当你想用这些元素做一些事情时,这会变得很棘手,在你的例子中,这些元素似乎可以转换成数字,在这种情况下,我建议在填充列表之前进行转换。@al3c:我试图在函数中显示多态性。似乎不能这样做。如果希望列表包含任何对象,可以使用
List
。当你想用这些元素做一些事情时,这会变得很棘手,在你的例子中,这些元素似乎可以转换成数字,在这种情况下,我建议在填充列表之前进行转换。@al3c:我试图在函数中显示多态性。看来不能这样做,谢谢。我试图展示函数中的多态性。所以我不能那样做(因为toDouble方法的不同)。谢谢。我试图展示函数中的多态性。所以我不能这样做(因为toDouble方法的不同)。