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

183
Visualizações
Las anotaciones esperadas multiplataforma de Kotlin devuelven `Esta clase no tiene un constructor` con el alias de tipo real de neo4j

Tengo un proyecto multiplataforma con una clase modal, Usuario.

Usuario.kt

 class User { val id = -1 val username = "" val age = -1 val nickname = "" }

También tengo anotaciones esperadas y reales.

Annotation.kt [Módulo común]

 expect annotation class NodeEntity expect annotation class Id expect annotation class GeneratedValue

Además, tengo su implementación real.

Annotation.kt [Módulo JVM]

 actual typealias ValueFor = org.neo4j.ogm.annotation.ValueFor actual typealias NodeEntity = org.neo4j.ogm.annotation.NodeEntity actual typealias Id = org.neo4j.ogm.annotation.Id actual typealias GeneratedValue = org.neo4j.ogm.annotation.GeneratedValue actual typealias Relationship = org.neo4j.ogm.annotation.Relationship

Luego volví y anoté mi User.kt

 @NodeEntity class User { @Id @GeneratedValue val id = -1 val username = "" val age = -1 val nickname = "" }

Pero cuando lo compilo, me sale este error.

 Task :compileKotlinJvm FAILED e: ...User.kt: (13, 2): This class does not have a constructor e: ...User.kt: (21, 6): This class does not have a constructor e: ...User.kt: (22, 6): This class does not have a constructor

¿Qué estoy haciendo mal?

NÓTESE BIEN. Intentos realizados

  • Hizo que las anotaciones esperadas tuvieran un constructor [sin éxito]
  • Hizo que las anotaciones esperadas coincidieran con un constructor [ERROR: el parámetro ''{0}'' tiene valores en conflicto en la anotación esperada y real]

FYI: Mi build.gradle ya tiene el noArg en su lugar, por lo que la clase User.kt se compila con un constructor público sin argumentos

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Sus anotaciones esperadas probablemente necesiten paréntesis explícitos.

 expect annotation class SharedImmutable()
 actual typealias SharedImmutable = kotlin.native.SharedImmutable

https://github.com/touchlab/Stately/blob/4b17057ad5d55f51f4ccf971cf79e51585ad2324/src/commonMain/kotlin/co/touchlab/stately/annotation/Annotations.kt#L26

over 4 years ago · Santiago Trujillo Relatório

0

Experimenté un problema similar, pero aparentemente como el OP, ya incluí el paréntesis explícito. Mi problema particular tenía que ver con la biblioteca de Java, en el conjunto de fuentes de Java, que no estaba disponible para otro subproyecto de Gradle que dependía de él.

TL;DR

Comprueba que estás exponiendo correctamente las dependencias específicas de la plataforma. Por ejemplo, usar correctamente la implementation y la api en los archivos build.gradle .

Desarrollando mi escenario

Tuve una compilación de varios proyectos de Gradle:

 Project AppSubProject LibrarySubProject

Donde AppSubProject dependía de LibrarySubProject . Ambos subproyectos de Gradle eran módulos multiplataforma de Kotlin.

En LibrarySubProject , había una clase de anotación expuesta:

Conjunto de fuente común:

 expect annotation class Inject()

Conjunto de fuentes JVM:

 actual typealias Inject = javax.inject.Inject

La anotación Kotlin Common Inject estaba disponible para AppSubProject ya que dependía de LibrarySubProject .

Subproyecto de aplicación/build.gradle:

 ... commonMain { dependencies { implementation project(":LibrarySubProject") ...

La causa del problema

En el archivo LibrarySubProject/build.gradle no estaba exponiendo la dependencia de JVM:

 ... jvmMain { dependencies { implementation "javax.inject:javax.inject:1" ...

Como puede ver, estaba usando la implementation en lugar de api . Entonces, cuando usé la anotación en un constructor de una clase en AppSubProject :

 class Example @Inject constructor()

y cuando construí AppSubProject , no pudo resolver la dependencia de JVM y me estaba dando el siguiente error de forma críptica:

 e: Example.kt: This class does not have a constructor

La solución

La solución fue simplemente exponer la dependencia de JVM para que pudiera resolverse en el otro módulo. Entonces, cambiar la implementation a api resolvió el problema.

 ... jvmMain { dependencies { api "javax.inject:javax.inject:1" ...

Suma

Si experimenta este problema, afirme lo siguiente:

  • La clase de anotación común de Kotlin proporciona explícitamente el paréntesis del constructor como se indica en esta respuesta
  • Todas las dependencias necesarias específicas de la plataforma se exponen correctamente
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