我有下面的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 回答
您可以传入
0
作为显式参数 .一些简单的泛型可以在这里提供解决方案:
对Float这样调用:
对于Short来说就像这样: