Generics 在函数参数中接受不同类型的ArrayList

Generics 在函数参数中接受不同类型的ArrayList,generics,kotlin,Generics,Kotlin,我想要一个函数,可以接受不同类型的ArrayList,并用它做一些操作。例如,我想打印数组的所有元素。我试过这个: val numbers by lazy {ArrayList<Int>(0)} val texts by lazy {ArrayList<String>(0)} fun main() { numbers.add(1) numbers.add(2) numbers.add(3) texts.add("one") tex

我想要一个函数,可以接受不同类型的ArrayList,并用它做一些操作。例如,我想打印数组的所有元素。我试过这个:

val numbers by lazy {ArrayList<Int>(0)}
val texts by lazy {ArrayList<String>(0)}

fun main() {
    numbers.add(1)
    numbers.add(2)
    numbers.add(3)
    texts.add("one")
    texts.add("two")
    texts.add("three")
    printAll(numbers)    //error here
    printAll(texts)      //error here
}

fun printAll(values: ArrayList<Any>){
    values.forEach{item ->
        println(item)
    }
}
惰性{ArrayList(0)} 由lazy{ArrayList(0)}生成的val文本 主要内容(){ 数字。添加(1) 数字。添加(2) 数字。添加(3) 文本。添加(“一”) 文本。添加(“两个”) 文本。添加(“三”) printAll(number)//此处出错 printAll(text)//此处出错 } 趣味printAll(值:ArrayList){ values.forEach{item-> println(项目) } } 但是我得到了这个错误:

Type mismatch: inferred type is kotlin.collections.ArrayList<Int> /* = java.util.ArrayList<Int> */ but kotlin.collections.ArrayList<Any> /* = java.util.ArrayList<Any> */ was expected
Type mismatch: inferred type is kotlin.collections.ArrayList<String> /* = java.util.ArrayList<String> */ but kotlin.collections.ArrayList<Any> /* = java.util.ArrayList<Any> */ was expected
类型不匹配:推断类型为kotlin.collections.ArrayList/*=java.util.ArrayList*/但应为kotlin.collections.ArrayList/*=java.util.ArrayList*/
类型不匹配:推断类型为kotlin.collections.ArrayList/*=java.util.ArrayList*/但应为kotlin.collections.ArrayList/*=java.util.ArrayList*/
这是我想做的事情的简化版本。在我的实际实现中,参数
values
是从另一个回调函数接收的,我需要对元素执行比打印更复杂的操作


我应该在函数参数中尝试什么?谢谢。

这可以通过在方法签名中使用
out
前缀
Any
来解决

fun printAll(values: ArrayList<out Any>){
    values.forEach{item ->
        println(item)
    }
}
funprintall(值:ArrayList){
values.forEach{item->
println(项目)
}
}
阅读更多:


这可以通过在方法签名中使用
out
前缀
Any
来解决

fun printAll(values: ArrayList<out Any>){
    values.forEach{item ->
        println(item)
    }
}
funprintall(值:ArrayList){
values.forEach{item->
println(项目)
}
}
阅读更多:

您可以使用。在您的示例中,只需将函数更改为:

fun <T> printAll(values: ArrayList<T>) {...}
funprintall(值:ArrayList){…}
而kotlin编译器会将T更改为任何类型,您将使用。你应该阅读泛型——它在面向对象编程中非常有用

现在您可以像以前一样使用函数,因为编译器将为您确定T的类型。

您可以使用。在您的示例中,只需将函数更改为:

fun <T> printAll(values: ArrayList<T>) {...}
funprintall(值:ArrayList){…}
而kotlin编译器会将T更改为任何类型,您将使用。你应该阅读泛型——它在面向对象编程中非常有用

现在您可以使用与以前完全相同的函数,因为编译器将为您确定T的类型。

fun printAll(值:ArrayList)
fun printAll(值:ArrayList)
您将无法将项添加到函数中的列表中,只能读取它们。
fun printAll(值:ArrayList)
fun printAll(值:ArrayList)
您将无法将项目添加到函数中的列表中,只能读取它们。