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

Kotlin中使用MapStruct映射抽象类遇返回类型错误的解决方法咨询

解决Kotlin中MapStruct映射抽象类的报错问题

这个报错的核心原因有两个:一是你的Kotlin代码里mapToAnimalOutput方法的逻辑有漏洞,二是旧版本MapStruct对Kotlin接口默认方法的支持存在问题。咱们一步步来解决:

首先修复代码逻辑漏洞

你当前的when分支里没有返回值,导致哪怕输入是DogInput或CatInput,代码执行完分支后还是会走到抛出异常的语句。先把这个逻辑修正,确保每个分支都能正确返回对应的输出对象:

fun mapToAnimalOutput(animalInput: AnimalInput): AnimalOutput {
    return when (animalInput) {
        is DogInput -> mapToDogOutput(animalInput)
        is CatInput -> mapToCatOutput(animalInput)
        else -> throw RuntimeException("Unsupported animal type")
    }
}

方案1:将Mapper改为抽象类(推荐,兼容旧版MapStruct)

MapStruct对Kotlin接口的默认方法识别不太友好,它会误以为你需要它生成mapToAnimalOutput的实现,但返回类型AnimalOutput是抽象类,所以报错。把Mapper改成抽象类,MapStruct就会直接继承你写的具体方法,不会再尝试生成新的实现:

@Mapper(componentModel = "jsr330")
abstract class AnimalMapper {
    // 让MapStruct生成这两个方法的实现
    abstract fun mapToDogOutput(dogInput: DogInput): DogOutput
    abstract fun mapToCatOutput(catInput: CatInput): CatOutput

    // 这个方法用你自己的实现
    fun mapToAnimalOutput(animalInput: AnimalInput): AnimalOutput {
        return when (animalInput) {
            is DogInput -> mapToDogOutput(animalInput)
            is CatInput -> mapToCatOutput(animalInput)
            else -> throw RuntimeException("Unsupported animal type")
        }
    }
}

方案2:升级MapStruct版本(保留接口形式)

如果你更习惯用接口,可以升级MapStruct到1.5.3.Final及以上版本——新版本修复了对Kotlin接口默认方法的识别问题,会直接使用你提供的默认实现,而不是尝试生成新的代码。

修改依赖版本(以Gradle为例):

mapstructVersion = "1.5.3.Final"

然后用修正过返回逻辑的接口代码即可:

@Mapper(componentModel = "jsr330")
interface AnimalMapper {
    fun mapToDogOutput(dogInput: DogInput): DogOutput
    fun mapToCatOutput(catInput: CatInput): CatOutput

    fun mapToAnimalOutput(animalInput: AnimalInput): AnimalOutput {
        return when (animalInput) {
            is DogInput -> mapToDogOutput(animalInput)
            is CatInput -> mapToCatOutput(animalInput)
            else -> throw RuntimeException("Unsupported animal type")
        }
    }
}

两种方案都能解决你遇到的错误,编译后MapStruct会正确生成子类映射方法,同时mapToAnimalOutput会根据输入类型返回对应的具体输出实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 17:39:07