如何解决错误消息:“仅允许使用 -Xjvm-default 选项从具有 '@JvmDefault' 成员的接口进行继承”

FuM*_*bey 50 android kotlin

我是 Android 开发新手,目前正在构建我的第一个真正的应用程序。我正在尝试实现 MVVM 架构,因此我为每个片段都有一个 viewModel,并且每个 viewModel 都有一个 viewModelFactory。至少,我是这么理解的。

我使用每个人似乎都用于工厂的样板代码:

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")
    }
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是,编译器给了我以下错误:

e: C:\Users\ ...\ExampleViewModel.kt: (64, 7):仅允许使用 -Xjvm-default 选项从具有“@JvmDefault”成员的接口继承

这个错误是由我在 viewModel 中实现的 viewModelFactory 类产生的。我真的不知道这意味着什么,我找不到任何有用的东西,甚至找不到与我的具体问题相关的东西。我基本上遵循了一些有关创建第一个应用程序的基本教程,但我不断遇到这样的错误。在大多数情况下,我都能自己解决问题,但这一次有所不同。

我知道你们很多人都有丰富的经验和知识,所以我希望你们中的一些人抽出时间来帮助我,并给我一些提示,我可以做些什么来解决这个问题。

ian*_*ake 63

看来您直接或间接(通过其他一些库)取决于Lifecycle2.5.0-alpha01

根据这个问题

您需要临时将以下内容添加到您的build.gradle

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

请注意,在某些情况下您可能想要使用all-compatibility而不是,请在Jebrain 的博客文章all中了解更多信息。

从 kotlin 1.6.20 开始,您将不需要 touch build.gradle 有关更多信息,请参阅KT-47000

  • 如果您使用“KotlinComplie”并遇到错误,您可以使用“org.jetbrains.kotlin.gradle.tasks.KotlinCompile” (14认同)
  • 我应该在哪个 build.gradle 中添加这个? (4认同)
  • @TedLavender 而不是 onf `tasks.withType(KotlinCompile).configureEach {` 使用 `tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {` (2认同)

小智 22

更新; 如果您使用1.6.20Kotlin 版本,则build.gradle不需要进行更改。

旧答案:

尝试将这些行放在模块 build.gradle 文件中的 android{} 块内

 kotlinOptions{
    freeCompilerArgs += [
            "-Xjvm-default=all",
    ]
}
Run Code Online (Sandbox Code Playgroud)

如果上面的代码不起作用,请尝试在 dependency{} 块中添加以下行

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


the*_*e64 8

@ianhanniballake 答案的 Kotlin 版本 (kts)

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