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

时间:2018-04-07 17:35:15

标签: kotlin

我有一个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&lt; 0)进行比较时遇到了麻烦。

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

非常感谢。

2 个答案:

答案 0 :(得分:2)

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

cell.layoutIfNeeded()

对Float:

这样调用
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"
        )
    }
}

对于Short来说就像这样:

checkConditions(leftLimit, rightLimit, 0F)

答案 1 :(得分:1)

您可以传递checkConditions(leftLimit, rightLimit, 0.toShort()) 作为明确的参数。

0