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

Kotlin实现网络映射器调用Java类报Named arguments are not allowed错误如何解决

问题原因与解决方案

1. Named arguments are not allowed for non-Kotlin functions报错根因

Kotlin调用Java编写的类的构造方法、普通方法时,不支持使用参数名 = 参数值的命名参数写法:Java字节码默认不会保留方法参数名元数据,Kotlin无法识别参数名匹配规则,必须严格按照Java方法定义的参数顺序传值,不能写参数名。

2. 类关系说明

你提供的Movie类并没有继承Result类,是持有List<? extends Result>类型的results属性,你需要先明确映射目标再选择对应实现方案:

方案1:映射单个网络实体为单条Result(单条影片数据)

你现有Mapper的泛型EntityMapper<MovieNetworkEntity, Result>适配该场景,只需要修正构造调用的写法即可:
注意:你之前传参的顺序和Java Result构造的参数顺序不一致,会导致字段赋值错误,必须严格按照Java构造的参数顺序传值
Java Result构造参数顺序:int id → String overview → String poster_path → String release_date → String title → Double vote_average
修正后的代码:

class MovieNetworkMapper : EntityMapper<MovieNetworkEntity, Result> {
    override fun mapFromEntity(entity: MovieNetworkEntity): Result {
        // 去掉命名参数,严格按构造顺序传值
        return Result(
            entity.id,
            entity.overview,
            entity.posterPath,
            entity.releaseDate,
            entity.title,
            entity.voteAverage
        )
    }

    override fun mapToEntity(domainModel: Result): MovieNetworkEntity {
        // 如果MovieNetworkEntity是Java类,同样去掉命名参数,按其构造顺序传值
        return MovieNetworkEntity(
            domainModel.id,
            domainModel.title,
            domainModel.overview,
            domainModel.poster_path,
            domainModel.release_date,
            domainModel.vote_average
        )
    }
}

方案2:映射网络响应列表为Movie类

如果你需要返回包含多条影片的Movie实例,需要新建对应Mapper处理列表映射:
假设外层网络实体为MovieListNetworkEntity,包含影片列表字段,实现示例:

class MovieListNetworkMapper : EntityMapper<MovieListNetworkEntity, Movie> {
    private val itemMapper = MovieNetworkMapper()

    override fun mapFromEntity(entity: MovieListNetworkEntity): Movie {
        // 先把列表中每个子项转成Result,再传入Movie构造
        val resultList = entity.movieItemList.map { itemMapper.mapFromEntity(it) }
        return Movie(resultList)
    }

    override fun mapToEntity(domainModel: Movie): MovieListNetworkEntity {
        val entityList = domainModel.results.map { itemMapper.mapToEntity(it) }
        return MovieListNetworkEntity(entityList)
    }
}

3. 其他疑问解答

你之前映射Movie类时提示未传入result参数,是因为Movie类构造要求传入List<Result>类型的results参数,按照方案2的逻辑先转换好列表再传入即可,不需要额外类型转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:36:04