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
相关产品推荐
相关产品推荐

