在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
}
关于在创建null数组时如何避免未经检查的强制转换的任何建议?
这是上述类的简单单元测试:
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>
但是,未经检查的转换问题仍然存在。此变化基于Andrey Breslav的帖子:https://stackoverflow.com/a/20297428/2735286
最佳答案
您将创建一个仅由null
(arrayOfNulls<Comparable<T>>(capacity)
)组成的数组。这意味着您有一个capacity
为null的数组。然后您要将数组强制转换为不可为空的数组吗?那没有任何意义。您真的没有安全的方法来摆脱未经检查的 Actor 表,因为它是不安全的,如果您尝试强制 Actor 表,它将给您带来麻烦。
关于casting - 使用arrayOfNulls时是否可以删除Kotlin中未经检查的类型转换?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46102430/