首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导致此错误的原因: com.android.tools.r8.internal.nc:密封类不支持作为程序类

导致此错误的原因: com.android.tools.r8.internal.nc:密封类不支持作为程序类
EN

Stack Overflow用户
提问于 2022-08-23 05:24:31
回答 3查看 244关注 0票数 3

我正在学习Jetpack写作,在学习的同时,我遇到了一些我不知道如何解决的问题。下面是我的开发环境、代码和编译结果。

环境:

  • Android Studio花栗鼠2021.2.1修补程序2 2Build
  • Kotlin版本: 1.7.10
  • Android Gradle版本: 7.2.2
  • JDK版本: 17.0.4
  • CompileSdk: 33

代码:

代码语言:javascript
复制
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            DemoTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    Greeting()
                }
            }
        }
    }
}
代码语言:javascript
复制
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun Greeting(
    viewModel: GreetingViewModel = remember {
        GreetingViewModel()
    }
) {
    val uiState = viewModel.uiState.collectAsState().value
    Column(
        modifier = Modifier
            .fillMaxWidth()
            .padding(32.dp)
    ) {
        TextField(value = uiState.name, onValueChange = {

            viewModel.handleAction(
                GreetingViewModel.UiAction.NameChanged(it)
            )
        })
        Text(text = "Hello ${uiState.name}!")
    }
}
代码语言:javascript
复制
class GreetingViewModel {
    data class UiState(val name: String)

    private val _uiState = MutableStateFlow(UiState(name = ""))
    val uiState: StateFlow<UiState> = _uiState.asStateFlow()

    sealed class UiAction {
        class NameChanged(val name: String) : UiAction()
    }

    fun handleAction(action: UiAction) {
        when (action) {
            is UiAction.NameChanged -> {
                _uiState.value = uiState.value.copy(
                    name = action.name
                )
            }
        }
    }
}

结果:

代码语言:javascript
复制
GreetingViewModel$UiAcion.class: Decompiled.class file, bytecode version:61.0(Java 17)

Waring: One or more classes has class file version >= 56 which is not officially supported.

Error: com.android.tools.r8.internal.nc: Sealed classes are not supported as program classes
EN

回答 3

Stack Overflow用户

发布于 2022-08-24 06:43:14

D8和R8编译器(生成Sealed classes are not supported as program classes错误的编译器)中不完全支持密封类。在https://issuetracker.google.com/227160052中跟踪完全支持密封类。D8支持将出现在,目前正在预览中,而R8支持要到更高版本才会出现。

票数 1
EN

Stack Overflow用户

发布于 2022-10-20 16:56:22

这是由于使用JDK 17构建,而不是告诉它让Android兼容(即。( Java 11)。在为Android构建Java / Kotlin类时,需要生成兼容Java 11的字节码。您仍然可以使用JDK 17进行构建,但您需要告诉它将其拨回一点,而不是使用dexer无法处理的新内容。

您可以在构建文件中这样做(假设这里的tasks.withType构建文件,groovy文件的tasks.withType语法略有不同):

代码语言:javascript
复制
    // Pure Kotlin
    tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
        jvmTarget = JavaVersion.VERSION_11.toString()
    }
    // Pure Java
    tasks.withType<JavaCompile>().configureEach {
        sourceCompatibility = JavaVersion.VERSION_11.toString()
        targetCompatibility = JavaVersion.VERSION_11.toString()
    }
    // Android
    android {
        compileOptions {
            sourceCompatibility = JavaVersion.VERSION_11
            targetCompatibility = JavaVersion.VERSION_11
        }
    }

更多解释:

正如输出所述,类文件有一个字节码版本61 (对应于Java 17 ),并且不支持具有版本>= 56 (Java 12)的类文件,换句话说,不支持Java 11上的任何内容。

在本例中,它所讨论的密封类很可能是Java 17中引入的Java类,而不是Kotlin类,如果针对Java 11的话,Kotlin类将被编译为与Java 11兼容的字节代码。

票数 1
EN

Stack Overflow用户

发布于 2022-08-23 05:38:44

在Kotlin 1.0中,密封的功能是相当有限的。例如,所有子类都必须嵌套,子类不能成为数据类(本章后面将讨论数据类)。Kotlin 1.1放宽了这些限制,并允许您在同一文件中的任何位置定义密封类的子类。在给定的示例中,直到现在才允许使用。在以后的版本中,他们可能会放宽这一限制。但是,您可以这样做:

代码语言:javascript
复制
class SomeActivity {
    sealed class Expr {
        data class Const(val number: Double) : Expr()
        data class Sum(val e1: Expr, val e2: Expr) : Expr()
        object NotANumber : Expr()
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73453524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档