casting - 使用arrayOfNulls时是否可以删除Kotlin中未经检查的类型转换?

标签 casting 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

}

关于在创建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/

相关文章:

iphone - 在方法之间传递时 float 被破坏(类型转换问题?)

sql - PostgreSQL:如何将带有 float 的字符串转换为整数?

C++ 非 const 到 const 转换编译错误

c - 实现 `memcpy()` : Is `unsigned char *` needed, 还是只是 `char *`?

java - Android Studio 中的图像资源变得奇怪

kotlin - 如何在 Kotlin 中的函数之间传播默认参数?

c# - 装箱拆箱也是类型转换?

android - 监听 onDownloadComplete Exoplayer

android - 如何制作通知 Activity 以在android中保存通知

kotlin - 为什么使用 Arrow 的 Options 而不是 Kotlin 可为空的