在使用arrayOfNulls时,是否可以删除Kotlin中未经检查的转换?

在Kotlin开发简单的主要队列的同时,我碰到了一个没有经过检查的警告,我无法摆脱:

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

以下是Kotlin优先级队列的完整源代码:

 class UnorderedMaxPQ<T : Comparable>(capacity: Int) { private val pq: Array = arrayOfNulls<Comparable>(capacity) as Array 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  exchange(a: Array, i: Int, min: Int) { val temp = a[i] a[i] = a[min] a[min] = temp } fun <T : Comparable> less(c1: T, c2: T) = c1 < c2 } 

任何建议如何避免未经检查的强制转换时创建一个空数组?

这是上面这个类的一个简单unit testing:

 import org.hamcrest.core.Is.`is` import org.junit.Assert.assertThat import org.junit.Test class UnorderedMaxPQTest { @Test fun insert_delMax() { val pq = UnorderedMaxPQ(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 = arrayOfNulls<Comparable>(capacity) as Array 

如:

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

未经检查的转换问题仍然存在。 这个变化是基于安德烈Breslav的职位: https ://stackoverflow.com/a/20297428/2735286

创建一个只包含null的数组( arrayOfNulls>(capacity) )。 这意味着你有一个capacity null的数组。 然后你想把数组转换为不可空的数组? 这没有任何意义。 你真的没有一个安全的方法来摆脱未经检查的阵容,因为它不安全的,如果你试图强制施放它, 导致你的问题。