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

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

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> 

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

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