Ограничение типов в Котлин для 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)
}
}