我有一个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。
非常感谢。
答案 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