Defino una enumeración que toma una referencia de método:
enum class Op(val param: (Expression<String>, String) -> Predicate) { GREATER_THAN(CriteriaBuilder::greaterThan) } Hay dos candidatos en la clase CriteriaBuilder , y el compilador no puede entender a cuál me refiero ("Ambigüedad de resolución de sobrecarga. Todas estas funciones coinciden"):
<Y extends Comparable<? super Y>> Predicate greaterThan(Expression<? extends Y> x, Expression<? extends Y> y); <Y extends Comparable<? super Y>> Predicate greaterThan(Expression<? extends Y> x, Y y);¿Por qué Kotlin no puede inferir el tipo correcto? Claramente, el primer método no es posible. No puedo encontrar la manera de guiar al compilador, convertirlo en el tipo correcto no parece funcionar:
GREATER_THAN(CriteriaBuilder::greaterThan as (Expression<String>, String) -> Predicate)El compilador se queja "No se puede elegir entre los siguientes candidatos sin completar la inferencia de tipo".
Dado el Javadoc de CriteriaBuilder , el método al que te refieres no es estático.
Dado que no está proporcionando una instancia de CriteriaBuilder en la referencia de su función, esto significa que CriteriaBuilder::greaterThan en realidad espera un receptor o parámetro de tipo CriteriaBuilder además de los 2 argumentos, que no coincide con la firma que espera. : (Expression<String>, String) -> Predicate .
Si desea que la persona que llama a Op.param proporcione la instancia del generador de criterios, sugiero cambiar el tipo de Op.param a (CriteriaBuilder, Expression<String>, String) -> Predicate o CriteriaBuilder.(Expression<String>, String) -> Predicate - que coincidiría con la referencia de función CriteriaBuilder::greaterThan . La elección de cuál usar depende de cómo quieras llamarlo:
enum class Op(val param: CriteriaBuilder.(Expression<String>, String) -> Predicate) { GREATER_THAN(CriteriaBuilder::greaterThan) } // or enum class Op(val param: (CriteriaBuilder, Expression<String>, String) -> Predicate) { GREATER_THAN(CriteriaBuilder::greaterThan) } Si desea que CriteriaBuilder "incorpore" la enumeración, puede crear una instancia por adelantado y luego usar su instancia específica en la referencia de la función:
val yourCriteriaBuilder: CriteriaBuilder = TODO("create it somehow") enum class Op(val param: (Expression<String>, String) -> Predicate) { GREATER_THAN(yourCriteriaBuilder::greaterThan) } No estoy familiarizado con la API de CriteriaBuilder , por lo que no estoy seguro de si esta última opción es realmente deseable. Es posible que desee nuevas instancias cada vez en su lugar: su llamada.