我正在尝试将一个对象t1映射到另一个对象t2。但是对象里面有一个列表。这是我的代码。但是当我得到错误说不能投射。这是我从API
获取的对象interface Api {
@GET("/api/")
fun getUsers(@Query("results") results: Int): Single<Dto.Users>
sealed class Dto {
data class Users(
@SerializedName("results") var resultDto: List<Result>
) : Dto()
data class Result(
var cell: String,
var email: String,
var gender: String,
var name: Name,
var nat: String,
var phone: String
) : Dto()
data class Name(
var first: String,
var last: String,
var title: String
) : Dto()
}
}
另一个要映射的数据类。
sealed class Entity {
data class Users(
val results: List<Result>
) : Entity()
data class Result(
var cell: String,
var email: String,
var gender: String,
var name: Name,
var nat: String,
var phone: String
) : Entity()
data class Name(
var first: String,
var last: String,
var title: String
) : Entity()
}
这是我用来转换成实体的扩展函数。
Api.Dto.Users.map() = Entity.Users(
resultDto.map { result ->
Entity.Result(
result.cell,
result.email,
result.gender,
Entity.Name(result.name.first, result.name.last, result.name.title),
result.nat,
result.phone
)
}
)
以及我如何使用扩展函数将dto转换为实体。
val data = dataFromServer.applyIoScheduler().map { userObj -> { userObj.map() } }
我试着设置你的例子。如前所述,你漏掉了Api
,Dto
,Entity
。但是在添加它们之后,我得到了一个工作示例(可以编译)。因为类名相等,所以不容易理解。也许你也纠结于此,把错误的类型联系在一起?这是你的意图吗?:
open class Entity {
data class Users(
var resultDto: List<Entity.Result>
) : Dto()
data class Result(
var cell: String,
var email: String,
var gender: String,
var name: Entity.Name,
var nat: String,
var phone: String
) : Dto()
data class Name(
var first: String,
var last: String,
var title: String
) : Dto()
}
open class Dto {
data class Users(
val results: List<Dto.Result>
) : Entity()
data class Result(
var cell: String,
var email: String,
var gender: String,
var name: Dto.Name,
var nat: String,
var phone: String
) : Entity()
data class Name(
var first: String,
var last: String,
var title: String
) : Entity()
}
fun Dto.Result.map(): Entity.Users {
return Entity.Users(
listOf(this).map { result ->
Entity.Result(
result.cell,
result.email,
result.gender,
Entity.Name(result.name.first, result.name.last, result.name.title),
result.nat,
result.phone
)
})
}