You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Android中使用Java 21模式匹配时出现编译器异常

解决Android中Java 21 Switch模式匹配编译报错问题

问题原因

Android的ART运行时未包含标准JVM的java.lang.runtime.SwitchBootstraps类,而Java 21的switch类型模式匹配特性依赖该类实现。即便配置了Java 21编译选项,Android默认编译流程无法处理这一特性,从而触发编译错误。

解决方案

1. 升级Android Gradle Plugin(AGP)

确保使用AGP 8.2.0及以上版本,该版本开始优化对Java 21特性的支持,包括对相关代码的desugar转换能力。

2. 配置编译选项与Desugar

在build.gradle.kts中添加以下完整配置:

android {
    compileSdk = 34 // 建议使用最新稳定Android SDK版本
    defaultConfig {
        targetSdk = 34
    }

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_21
        targetCompatibility = JavaVersion.VERSION_21
        // 启用核心库desugar,转换JVM特有代码适配ART
        isCoreLibraryDesugaringEnabled = true
    }

    kotlinOptions {
        jvmTarget = "21"
    }
}

dependencies {
    // 引入desugar库,使用最新可用版本
    coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.4")
}

3. 启用预览特性(可选)

若上述配置仍报错,可尝试开启预览特性支持(尽管switch模式匹配在Java 21已是正式特性,但Android环境可能需要额外声明):
在compileOptions中追加:

compileOptions {
    // ...已有配置
    arguments.add("--enable-preview")
}

同时在defaultConfig中添加测试运行时参数:

defaultConfig {
    // ...已有配置
    testInstrumentationRunnerArguments["androidx.test.runner.enablePreview"] = "true"
}

4. 临时替代方案

如果以上配置均无法解决问题,可暂时用传统instanceof判断逻辑替代switch模式匹配,直到Android对Java 21该特性的支持完全成熟:

static <T> void checkType(T value) {
    if (value instanceof Integer) {
        System.out.println("Integer");
    } else if (value instanceof String) {
        System.out.println("String");
    } else {
        throw new IllegalArgumentException("Unsupported type: " + value.getClass());
    }
}

内容的提问来源于stack exchange,提问作者HubbleCommander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 11:07:37