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 GeneratedValueAdemá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.RelationshipLuego 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
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
Sus anotaciones esperadas probablemente necesiten paréntesis explícitos.
expect annotation class SharedImmutable() actual typealias SharedImmutable = kotlin.native.SharedImmutableExperimenté 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 constructorLa 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: