Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

252
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda