首页 文章

Kotlin - 创建一个比较任何类型数字的函数

提问于
浏览
2

我有下面的Kotlin对象声明,检测到气味(重复代码)

object Random {

    internal fun generatePositiveFloat(
        leftLimit: Float = Float.MIN_VALUE,
        rightLimit: Float = Float.MAX_VALUE
    ): Float {
        if (leftLimit < 0) {
            throw InvalidAlgorithmParameterException("
                Left limit can't be negative"
            )
        } else if (rightLimit <= leftLimit) {
            throw InvalidAlgorithmParameterException(
                "Right limit can't be less or equal than left limit"
            )
        }
        return Random().nextFloat()
     }

    internal fun generatePositiveShort(
        leftLimit: Short = 0,
        rightLimit:  Short = Short.MAX_VALUE
    ): Short {
        if (leftLimit < 0) {
            throw InvalidAlgorithmParameterException(
                "Left limit can't be negative"
            )
        } else if (rightLimit <= leftLimit) {
            throw InvalidAlgorithmParameterException(
                "Right limit can't be less or equal than left limit"
            )
        }
        return ThreadLocalRandom.current().nextInt(
            leftLimit.toInt(),
            rightLimit.toInt()
        ).toShort()
}

是否有任何想法将这个重复的代码取出到私有函数?

我的想法是这样的......

private fun validatePositiveLimits(
    leftLimit: Number,
    rightLimit: Comparable<Number>) {

    if (leftLimit as Comparable<Number> < 0) {
        throw InvalidAlgorithmParameterException(
            "Left limit can't be negative"
        )
    } else if (rightLimit <= leftLimit) {
        throw InvalidAlgorithmParameterException(
            "Right limit can't be less or equal than left limit"
        )
    }
}

...但是我在将leftLimit与0(leftLimit作为Comparable <0)进行比较时遇到了麻烦 .

我得到ClassCastException试图将整数转换为short并尝试将整数转换为float .

非常感谢 .

2 回答

  • 2

    您可以传入 0 作为显式参数 .

    private fun <T> validatePositiveLimits(zero: T, left: T, right: T) where T : Number, T : Comparable<T> {
        if (left < zero) {
            throw IllegalArgumentException("Left limit can't be negative")
        } else if (right <= left) {
            throw IllegalArgumentException("Right limit can't be less or equal than left limit")
        }
    }
    
  • 1

    一些简单的泛型可以在这里提供解决方案:

    private fun <T : Comparable<T>> checkConditions(left: T, right: T, leftLowerBound: T) {
        if (left < leftLowerBound) {
            throw InvalidAlgorithmParameterException(
                "Left limit can 't be negative"
            )
        } else if (right <= left) {
            throw InvalidAlgorithmParameterException(
                "Right limit can't be less or equal than left limit"
            )
        }
    }
    

    对Float这样调用:

    checkConditions(leftLimit, rightLimit, 0F)
    

    对于Short来说就像这样:

    checkConditions(leftLimit, rightLimit, 0.toShort())
    

相关问题