¿Cómo resuelvo el mensaje de error: “La herencia de una interfaz con miembros ‘@JvmDefault’ solo se permite con la opción -Xjvm-default”

4 minutos de lectura

Avatar de usuario de FuManchuObey
FuManchuObey

Soy nuevo en el desarrollo de Android y actualmente estoy creando mi primera aplicación real. Estoy tratando de implementar una arquitectura MVVM y por eso tengo un modelo de vista para cada fragmento y cada modelo de vista tiene una fábrica de modelos de vista. Al menos, así es como entendí que tiene que ser.

Uso el código repetitivo que todos parecen usar para la fábrica:

class ExampleViewModelFactory(private val exampleDao: ExampleDao) : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(exampleViewModel::class.java)) {
            @Suppress("UNCHECKED_CAST")
            return ExampleViewModel(exampleDao) as T
        }
        throw IllegalArgumentException("Unknown ViewModel class")
    }
}

Ahora el problema es que el compilador me está dando el siguiente error:

e: C:\Users\ …\ExampleViewModel.kt: (64, 7): la herencia de una interfaz con miembros ‘@JvmDefault’ solo se permite con la opción -Xjvm-default

Y este error lo produce la clase viewModelFactory que he implementado en el viewModel. Realmente no puedo decir qué significa esto y no puedo encontrar nada útil o incluso relacionado con mi problema específico. Básicamente seguí algunos tutoriales básicos sobre cómo crear tu primera aplicación, pero sigo encontrándome con errores como este. En la mayoría de los casos, pude solucionar el problema por mí mismo, pero esta vez es diferente.

Sé que muchos de ustedes tienen mucha experiencia y conocimiento, así que espero que algunos de ustedes encuentren el tiempo para ayudarme y darme una pista de lo que puedo hacer para solucionar esto.

avatar de usuario de ianhanniballake
ianhanniballake

Parece que estás directa o indirectamente (a través de alguna otra biblioteca) dependiendo de Ciclo vital 2.5.0-alpha01.

según este problema:

Necesita agregar temporalmente lo siguiente a su build.gradle:

tasks.withType(KotlinCompile).configureEach {
    kotlinOptions {
        freeCompilerArgs += [
                "-Xjvm-default=all",
        ]
    }
}

Tenga en cuenta que, en determinadas circunstancias, es posible que desee utilizar all-compatibility en lugar de allaprende más sobre eso en Entrada de blog de Jebrain.

A partir de kotlin 1.6.20, no necesitará tocar build.gradle para obtener más información, consulte KT-47000

  • Si utiliza KotlinComplie y obtuve un error que puedes usar org.jetbrains.kotlin.gradle.tasks.KotlinCompile

    -Chirag Savsani

    7 de febrero de 2022 a las 11:42

  • ¿En qué build.gradle debo agregar esto?

    – Shoaib Kakal

    20 de febrero de 2022 a las 6:52

  • build.gradle del módulo @ShoaibKhalid

    – theapache64

    8 de marzo de 2022 a las 19:27

  • @TedLavender en lugar de tasks.withType(KotlinCompile).configureEach { Usar tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {

    -Chirag Savsani

    17/03/2022 a las 11:35

  • ¿Sería realmente una mala práctica extender ViewModelProvider.NewInstanceFactory en lugar de implementar ViewModelProvider.Factory?

    – usuario2857033

    28 de agosto de 2022 a las 6:41

Avatar de usuario de Vivek Gupta
Vivek Gupta

Actualizar; Si utiliza 1.6.20 versión de Kotlin, luego cambiando build.gradle no es requerido.

Respuesta antigua:

Intente poner estas líneas dentro del bloque android{} en el archivo build.gradle del módulo

 kotlinOptions{
    freeCompilerArgs += [
            "-Xjvm-default=all",
    ]
}

Si el código anterior no funciona, intente agregar estas líneas a continuación dentro del bloque de dependencias {}

    tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach{
    kotlinOptions{
        freeCompilerArgs +=["-Xjvm-default=all",]
    }
}

  • El primero lo arregló, gracias 🙂

    –Harshal Pudale

    18 de noviembre de 2022 a las 15:35

Versión de Kotlin (kts) de la respuesta de @ianhanniballake

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class).configureEach {
    kotlinOptions {
        freeCompilerArgs = freeCompilerArgs + "-Xjvm-default=all"
    }
}

  • Si alguna de estas declaraciones se agregara al final de build.gradle o hay una sección específica del archivo, es decir android o dependencies que se debe colocar dentro? Recibo un error al agregar el código y sincronizar: org.gradle.internal.metaobject.AbstractDynamicObject$CustomMessageMissingMethodException: Could not find method withType() for arguments

    – John Harington

    16 de marzo de 2022 a las 17:33

Usa la versión estable, en este caso la 2.4.1. Tengo el mismo problema y lo resolví haciendo este cambio.

https://developer.android.com/jetpack/androidx/releases/lifecycle

En mi caso, el problema estaba en la versión de las bibliotecas de kotlin.

Estaba usando en build.gradle:

classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10

y en build.gradle (aplicación) [for Java compatibility]:

implementation "org.jetbrains.kotlin:kotlin-stdlib:1.6.10"

luego creo una variable kotlin_version común en ext:

buildscript {
  ext {
    ...
    kotlin_version='1.7.10'
  } ...

y use para ambos (cada uno en su lugar respectivo):

classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

Avatar de usuario de Mahmoud Elgamal
Mahmud Elgamal

usa estas dependencias en tu gradle

implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.5.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'

Avatar de usuario de Boken
Boken

Cuando anulas la diversión de crear ViewModelProvider.Factory evitar el signo de interrogación después de vieModel

Incorrecto:

<T : ViewModel?>

Correcto:

< T : ViewModel>

Parece que hubo algunos cambios en la clase.

¿Ha sido útil esta solución?