Ограничение типов в Котлин для Array

У меня есть следующий код:

    private fun <T> checkSize(srcData: List<List<T>>) {
        require(srcData.isNotEmpty())
        srcData.forEach {
            require(srcData.size == it.size)
        }
    }

Я хотел бы, чтобы он работал и для srcData: Array<Array<T>>, но дело в том, что Array не имплементирует никакой интерфейс, поэтому я не могу сделать, например:

fun <T : Collection<Collection<Any>>> checkSize(srcData: T) {...}

Единственный выход - дублирование кода для массивов, что мне не очень нравится. Есть ли ещё варианты?

P.S. Пытался сделать так, но почему то умное приведение Котлина не работает в этом случае:

    private fun <T> checkSize(srcData: T) {
        if (srcData is Array<*> || srcData is Collection<*>) {
            require(srcData.isNotEmpty()) { ERR_SIZE_EM }
            srcData.forEach {
                if (it is Array<*> || it is Collection<*>)
                    require(srcData.size == it.size) { ERR_SIZE_SQ }
            }
        }
    }

Однако, если убрать || (оставив какое то одно условие), то всё будет работать.


Ответы (1 шт):

Автор решения: Eugene Krivenja

Не нужно пытаться совместить несовместимое. Что вам мешает сделать вот так?

private fun <T> checkSize(srcData: Array<Array<T>>) {
    checkSize(srcData.asList().map { it.asList() })
}

private fun <T> checkSize(srcData: List<List<T>>) {
    require(srcData.isNotEmpty())
    srcData.forEach {
        require(srcData.size == it.size)
    }
}
→ Ссылка