Инициализировать массив не опциональных без использования конструктора - PullRequest
0 голосов
/ 01 июля 2019

Я использую Array необязательных значений, и я хочу, чтобы они оставались необязательными, но я не могу использовать конструктор по умолчанию Array из-за проблем, описанных здесь .

Кроме того, уловка .also{}, описанная в ссылке, не будет работать для меня, потому что моя не является массивом некоторого примитивного типа со своим собственным специальным классом WhateverArray.

Есть ли какой-нибудь трюк Котлина, с помощью которого я могу инициализировать мой a ниже?Или я должен прибегнуть к созданию списка и его преобразованию?

// please assume Stream<MyNonprimitiveType> magically gives me
// size() -> Int and
// next() -> MyNonprimitiveType
val stream : Stream<MyNonprimitiveType> = Stream<MyNonprimitiveType>()
val size : Int = stream.size()
val a : Array<MyNonprimitiveType> = ??? // use stream.next()

1 Ответ

2 голосов
/ 01 июля 2019

Вот полный пример того, что вы хотите, без использования временного списка:

class Stream<T>(private val list: List<T>) {
    val size = list.size;
    private val it = list.iterator()

    fun next(): T {
        return it.next()
    }
}

inline fun <reified T: Any> Stream<T>.toArray(): Array<T> {
    val tmp: Array<T?> = arrayOfNulls(size)
    for (i in 0 until size) {
        tmp[i] = next()
    }
    return tmp as Array<T>
}

fun main() {
    val stream : Stream<String> = Stream(listOf("a", "b"))
    val a: Array<String> = stream.toArray()

    println(Arrays.toString(a))
}
...