es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Advertencia de discrepancia en el campo de la habitación / getter al usar clases selladas o Any.

Tengo una base de datos Room (v2.4.0-beta01), y si bien funciona bien, durante la compilación muestra una advertencia de incompatibilidad de campo vs. getter en algunos campos, que se incluyen a continuación.

Sospecho que esto se debe a un problema de interoperabilidad entre Kotlin y Java, ya que las definiciones de campo en Kotlin y Java autogenerado no coinciden perfectamente. Si bien entiendo que el problema con Any es comprensible, esperaría que la lista de objetos de clase sellada funcionara sin problemas.

¿Alguna idea de cómo podría resolver idealmente la advertencia, o al menos hacerle saber a Room que no es un problema?

PD: Los nombres de las clases/variables se han cambiado por privacidad y simplicidad.

Advertencias:

El campo myObjects de la clase com.example.Entity tiene el tipo java.util.List<? extends com.example.MySealedClass>, pero su getter devuelve java.util.List<com.example.mysealedclass>. Esta incompatibilidad puede causar valores inesperados de myObjects en la base de datos cuando se inserta com.example.Entity en la base de datos.
    private java.util.List<? extends com.example.MySealedClass> layoutElements;

El campo myMap de la clase com.example.Entity tiene el tipo java.util.Map<java.lang.string,></java.lang.string,>, pero su getter devuelve java.util.Map<java.lang.string, java.lang.object="">. Esta incompatibilidad puede causar valores inesperados de myMap en la base de datos cuando se inserta com.example.Entity en la base de datos.
    private java.util.Map<java.lang.string, extends="" java.lang.object=""> myMap;

Entity.kt:

@ColumnInfo(name = "myObjects")
var myObjects: List<mysealedclass> = listOf(),

@ColumnInfo(name = "myMap")
@TypeConverters(MyTypeConverter::class)
var myMap: Map<string, any="">? = null,

Entity.java (generado por Room):

@org.jetbrains.annotations.NotNull()
@androidx.room.ColumnInfo(name = "myObjects")
private java.util.List<? extends com.example.MySealedClass> myObjects;

@org.jetbrains.annotations.Nullable()
@androidx.room.ColumnInfo(name = "myMap")
private java.util.Map<java.lang.string, extends="" java.lang.object=""> myMap;

MySealedClass.kt:

sealed class MySealedClass(val x: Int, val y: Boolean = false) : Serializable {
data class InnerClass(private val z: Int) : MySealedClass(z), Serializable
data class InnerClass2(private val zz: Int) : MySealedClass(z), Serializable
}
</java.lang.string,></string,></java.lang.string,></java.lang.string,></com.example.mysealedclass>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La advertencia indica una discrepancia entre los tipos de campo y los tipos de getter para myObjects y myMap en la clase Entity. Esto probablemente se debe a un problema de interoperabilidad entre Kotlin y Java. La lista de objetos de clase sellada también puede estar causando problemas.

    Para resolver la advertencia, puedes intentar definir los campos como java.util.List<com.example.mysealedclass> y java.util.Map<java.lang.string, java.lang.object="">, respectivamente, tanto en la clase Kotlin Entity como en el código Java generado automáticamente. Alternativamente, puedes intentar cambiar los tipos de getter para que coincidan con los tipos de campo.

    Si no puedes resolver la advertencia, puedes informar a Room que no es un problema al suprimir la advertencia con @SuppressWarnings("MismatchedGetterReturnType") justo antes del método getter de myObjects y myMap en el código Java generado por Room.</java.lang.string,></com.example.mysealedclass>

Comments are closed.