Можно ли удалить непроверенный бросок в Kotlin при использовании arrayOfNulls?

Пока вы разрабатываете простую основную очередь в Котлине, я столкнулся с неконтролируемым актом с беспрепятственным предупреждением о том, что я не могу избавиться:

private val pq: Array<T> = arrayOfNulls<Comparable<T>>(capacity) as Array<T> 

Вот полный исходный код очереди приоритетов Kotlin:

 class UnorderedMaxPQ<T : Comparable<T>>(capacity: Int) { private val pq: Array<T> = arrayOfNulls<Comparable<T>>(capacity) as Array<T> private var size = 0 fun isEmpty() = size == 0 fun size() = size fun insert(x: T) { pq[size++] = x } fun delMax(): T { var max = 0 (1..size - 1) .asSequence() .filter { less(pq[max], pq[it]) } .forEach { max = it } exchange(pq, max, size - 1) return pq[--size] } fun <T> exchange(a: Array<T>, i: Int, min: Int) { val temp = a[i] a[i] = a[min] a[min] = temp } fun <T : Comparable<T>> less(c1: T, c2: T) = c1 < c2 } 

Любые предложения о том, как избежать неконтролируемого приведения при создании массива нулей?

Вот простой единичный тест класса выше:

 import org.hamcrest.core.Is.`is` import org.junit.Assert.assertThat import org.junit.Test class UnorderedMaxPQTest { @Test fun insert_delMax() { val pq = UnorderedMaxPQ<Int>(10) pq.insert(2) pq.insert(3) pq.insert(4) pq.insert(1) assertThat(pq.delMax(), `is`(4)) assertThat(pq.delMax(), `is`(3)) assertThat(pq.size(), `is`(2)) pq.insert(10) assertThat(pq.size(), `is`(3)) assertThat(pq.delMax(), `is`(10)) assertThat(pq.isEmpty(), `is`(false)) } } 

Изменить 1:

Вы можете переписать это:

 private val pq: Array<T> = arrayOfNulls<Comparable<T>>(capacity) as Array<T> 

в виде:

 private val pq: Array<T> = Array<Comparable<T>?>(capacity, { null }) as Array<T> 

Тем не менее, проблема неконтролируемого броска сохраняется. Этот вариант основан на сообщении Андрея Бреслава: https://stackoverflow.com/a/20297428/2735286

Вы создаете массив, состоящий только из null ( arrayOfNulls<Comparable<T>>(capacity) ). Это означает, что у вас есть массив с нулевыми значениями capacity . А затем вы хотите, чтобы массив был не нольбежным? Это не имеет никакого смысла. У вас действительно нет безопасного способа избавиться от неконтролируемого приведения, поскольку он небезопасен, и это вызовет проблемы, если вы попытаетесь заставить его бросить.

Intereting Posts
JaVers обнаруживает изменения в childs, если изменяется свойство simple в корневом объекте Не удалось загрузить плагин для eclipse Топливо, Котлин, Гсон, ожидается BEGIN_ARRAY, но BEGIN_OBJECT в строке 1 Управление жизненным циклом файлов cookie в сервлете Ktor 0.9.0 Почему интеллектуальное сканирование сбрасывается для значения NULL после установки значения и проверки, является ли оно нулевым? Передача списка объектов в фрагмент У Kotlin Android Extensions кешируются синтетические свойства или каждый раз, когда он вызывает findViewById ()? запустить HelloAndroid от градиента? андроидные запросы с несколькими областями с помощью RXJava Как передать vararg в функцию или конструктор varag в Kotlin? Ошибка библиотеки библиотеки Android: не удается найти установщик для поля. (Котлин) Привязать список объектов, используя Guice + Kotlin Как отобразить частичный экран камеры в kotlin Неожиданные жетоны (используйте, чтобы разделить выражения в одной строке) База данных комнаты Вставьте или обновите, но сохраните поле базы данных?