Принимать различные виды ArrayList в аргументе функции - PullRequest
1 голос
/ 08 октября 2019

Мне нужна функция, которая может принимать 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)
    }
}

Однако я получаю эту ошибку:

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

Это упрощенная версия того, что я хочу сделать. В моей реальной реализации аргумент values принимается из другой функции обратного вызова, и мне нужно делать более сложные вещи с элементами, чем просто печать.

Что мне следует попробовать в аргументе функции? Благодаря.

Ответы [ 2 ]

3 голосов
/ 08 октября 2019

Вы можете использовать Общие функции . В вашем примере просто измените свою функцию на:

fun <T> printAll(values: ArrayList<T>) {...}

, и компилятор kotlin изменит T на любой тип, который вы будете использовать. Вы должны прочитать о дженериках - это очень полезно в объектно-ориентированном программировании.

Теперь вы можете использовать свою функцию точно так же, как и раньше, потому что компилятор определит тип T для вас.

3 голосов
/ 08 октября 2019

Это можно решить с помощью префикса Any с out в сигнатуре метода.

fun printAll(values: ArrayList<out Any>){
    values.forEach{item ->
        println(item)
    }
}

Подробнее:

https://kotlinlang.org/docs/reference/generics.html

https://kotlinexpertise.com/kotlin-generics-and-variance-vs-java/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...