首页 > 解决方案 > 在 Kotlin 中正确使用 Number 类

问题描述

谁能帮我在 Kotlin 中实现这些方法?我想找到数字数组的最小、最大元素,并按升序对数组进行排序。这是一个代码

class DataArray<Number>(vararg numbers: Number) {
    private val array = mutableListOf<Number>(*numbers)

    fun getMin() {
        return array.minByOrNull { it! } //doesn't work
    }

    fun getMax() = array.max() //doesn't work
    fun sort() = array.sort()  //doesn't work


    private fun <E> MutableList<E>.max(): Any { //was created to use in function above, but resulted in stack overflow
        return this.max()
    }

    private fun <E> MutableList<E>.sort(): Any { //was created to use in function above, but resulted in stack overflow
        return this.sort()
    }

    override fun toString(): String {
        var str = ""
        for(i in array)
            str += "$i "
        return str
    }
}

fun main() {

    val arr = DataArray(2, 5, 2, 6, 9, -3, 56, 16, 72, 8)
    println(arr.getMax())
    println(arr.getMin())
    println(arr.sort())
    print(arr)
}

标签: kotlingenerics

解决方案


请注意,Number这里的词声明了一个名为 的通用参数Number。它没有提到kotlin.Number。您可能希望它声明一个带有边界的泛型参数,Number而不是,在这种情况下,您应该编写:

class DataArray<T: Number>(vararg numbers: T) {
    ...
}

但即使你这样做了,它仍然无法正常工作,因为Numbers are not compatible

您将不得不进一步T限制Comparable<T>

 class DataArray<T: Number>(vararg numbers: T) where T: Comparable<T> {

然后你可以这样做:

fun getMin() = array.minOrNull()
fun getMax() = array.maxOrNull()
fun sort() = array.sort()

扩展功能MutableList是不必要的。

(请注意,从技术上讲,T: Number如果您只想使用minOrNullmaxOrNull和,则该约束也是不必要的sort。我假设您计划使用 中的一种方法kotlin.Number。否则您可以删除该约束。)

你似乎试图MutableList通过委托来实现你自己的。请记住,您可以使用以下方法轻松完成此操作by

class DataArray<T: Number>(
        vararg numbers: T
) : MutableList<T> by mutableListOf(*numbers) {
    override fun toString(): String {
        var str = ""
        for(i in this) // rather than "array", use "this"
            str += "$i "
        return str
    }
}

推荐阅读