Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

247
Vistas
Cómo resolver la referencia ambigua del método Kotlin

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".

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda