我正在try 添加将一些域对象转换为javax.persistence.criteria.Predicate
的动态谓词,但是在泛型方法中正确指定类型时遇到了问题.下面是一段简化的代码,或多或少地呈现了我必须维护的方法契约.我的意思是,path
和value
都是以某种方式计算出来的.
enum class Operator { EQUAL, NOT_EQUAL, GREATER_THAN_OR_EQUAL, LESS_THAN_OR_EQUAL, GREATER_THAN, LESS_THAN, }
inline fun <T> buildPredicate(
root: Root<*>,
builder: CriteriaBuilder,
operator: Operator,
pathSupplier: () -> Path<T>,
valueSupplier: () -> T
) {
val path = pathSupplier()
val value = valueSupplier()
when (operator) {
EQUAL -> builder.equal(path, value) // ok
GREATER_THAN -> builder.greaterThan(path, value) // this wont compile though
else -> throw IllegalArgumentException()
}
}
在标记线上显示
None of the following functions can be called with the arguments supplied.
个
不过,我的目标是一个定义
<Y extends Comparable<? super Y>> Predicate greaterThan(Expression<? extends Y> x, Y y);
个
Is this even doable?个
作为附注,我可以添加上面示例中的运行时T
将解析为某个enum
、String
或LocalDateTime
.