Похоже, вам нужно объявить тип arg
как Y
. Тогда вы знаете, что arg
не является ненулевым Comparable<Y>
, поэтому вам не нужно проверять, является ли оно нулевым или сопоставимым, и тип вашей функции может быть выведен из аргумента, который вы передаете при его вызове.
fun <Y : Comparable<Y>> CriteriaBuilder.greaterThanPredicate(arg: Y, root: Root<T>) : Predicate {
return greaterThan(root.get(property), arg)
}
Вам все равно придется выполнить приведение, поскольку вы делаете предположение, основанное на значениях времени выполнения, которые компилятор не может проверить. Но вы можете, по крайней мере, переместить приведение к тому месту, где вы делаете предположение, и выполнить там безопасную проверку.
val arg : Any? = args.first()
return when (operator) {
EQUAL -> criteriaBuilder.equalPredicate(arg, root)
GREATER_THAN -> {
(arg as? Comparable<Int>) ?: throw IllegalStateException("Unsupported or missing argument")
criteriaBuilder.greaterThanPredicate(arg, root)
}
else -> throw IllegalStateException("Unknown comparison operator: $operator")
}
Если вы поддерживаете несколько сопоставимых типов, вам может потребоваться перечислить их:
val arg : Any? = args.first()
return when (operator) {
EQUAL -> criteriaBuilder.equalPredicate(arg, root)
GREATER_THAN -> when {
arg is Int -> criteriaBuilder.greaterThanPredicate(arg, root)
arg is Double -> criteriaBuilder.greaterThanPredicate(arg, root)
else -> throw IllegalStateException("Unsupported or missing argument")
}
else -> throw IllegalStateException("Unknown comparison operator: $operator")
}