¿Es posible eliminar el molde sin marcar en Kotlin cuando se usa arrayOfNulls?

Mientras desarrollé una queue primaria simple en Kotlin, he tropezado con un elenco sin marcar con una advertencia sin marcar de la que no me puedo deshacer:

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

Aquí está el código fuente completo de la queue de prioridad de Kotlin:

 class UnordenetworkingMaxPQ<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 } 

¿Alguna sugerencia sobre cómo evitar el elenco sin marcar al crear una matriz de nulos?

Aquí hay una testing unitaria simple de la class de arriba:

 import org.hamcrest.core.Is.`is` import org.junit.Assert.assertThat import org.junit.Test class UnordenetworkingMaxPQTest { @Test fun insert_delMax() { val pq = UnordenetworkingMaxPQ<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)) } } 

Editar 1:

Puedes volver a escribir esto:

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

como:

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

Sin embargo, el problema del lanzamiento no verificado persiste. Esta variación se basa en la publicación de Andrey Breslav: https://stackoverflow.com/a/20297428/2735286

Solutions Collecting From Web of "¿Es posible eliminar el molde sin marcar en Kotlin cuando se usa arrayOfNulls?"

Se crea una matriz que consiste únicamente en null ( arrayOfNulls<Comparable<T>>(capacity) ). Eso significa que tiene una matriz con nulos de capacity . ¿Y luego quieres lanzar la matriz a una que no admite nulos? Eso no tiene ningún sentido. Realmente no tienes una manera segura de deshacerte del yeso no revisado ya que no es seguro y te causará problemas si tratas de forzarlo a lanzar.