首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用MapStruct实现Kotlin中的映射抽象类型

用MapStruct实现Kotlin中的映射抽象类型
EN

Stack Overflow用户
提问于 2021-10-09 08:26:10
回答 1查看 500关注 0票数 2

我试图用Kotlin中的Mapstruct映射一个抽象类,但是得到了以下错误:

代码语言:javascript
复制
AnimalMapper.java: error: The return type AnimalOutput is an abstract class or interface. Provide a non abstract / non interface result type or a factory method.

我的实施:

代码语言:javascript
复制
@Mapper(componentModel = "jsr330")
interface AnimalMapper {

    fun mapToDogOutput(dogInput: DogInput): DogOutput

    fun mapToCatOutput(catInput: CatInput): CatOutput

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

sealed class AnimalInput {
    abstract val name: String
}

data class CatInput(
    override val name: String,
    val catProperty: Int,
) : AnimalInput()

data class DogInput(
    override val name: String,
    val dogProperty: Float,
) : AnimalInput()

sealed class AnimalOutput {
    abstract val name: String
}

data class CatOutput(
    override val name: String,
    val catProperty: Int,
) : AnimalOutput()

data class DogOutput(
    override val name: String,
    val dogProperty: Float,
) : AnimalOutput()

在我以前的java项目中,这个相应的实现可以像预期的那样工作:

代码语言:javascript
复制
@Mapper(componentModel = "jsr330")
interface AnimalMapper {

    DogOutput mapToDogOutput(DogInput dogInput);

    CatOutput mapToCatOutput(CatInput catInput);

    default AnimalOutput mapToAnimalOutput(AnimalInput animalInput) {
        if (animalInput instanceof DogInput) {
            return mapToDogOutput((DogInput) animalInput);
        }
        if (animalInput instanceof CatInput) {
            return mapToCatOutput((CatInput) animalInput);
        }
        throw new RuntimeException("Unsupported animal type");
    }
}

public abstract class AnimalInput {
    public String name;
}

public abstract class CatInput extends AnimalInput {
    public String name;
    public int catProperty;
}

public abstract class DogInput extends AnimalInput {
    public String name;
    public float dogProperty;
}

public abstract class AnimalOutput {
    public String name;
}

public abstract class CatOutput extends AnimalOutput {
    public String name;
    public int catProperty;
}

public abstract class DogOutput extends AnimalOutput {
    public String name;
    public float dogProperty;
}

我使用以下依赖版本:

  • mapstructVersion: 1.4.2.Final
  • kotlinVersion: 1.5.21 (jvmTarget 16)

谁有主意,如何在我的Kotlin项目中解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2021-10-19 18:40:27

这在Kotlin中不起作用的原因是,Kotlin生成的代码将mapToAnimalOutput方法标记为一个抽象方法。

您需要在该方法上使用@JvmDefault,以便Kotlin为该方法生成正确的修饰符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69505003

复制
相关文章

相似问题

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