Простое приведение в Kotlin / Java - PullRequest
0 голосов
/ 22 октября 2018

У меня есть объект User, определенный как ниже

class User(){
    var id: Int? = null
    var name: String? = null}

По определенным причинам я должен создать новый объект User с такими же параметрами, и мне нужно скопировать данные из старого в новый тип.

class UserNew(){
    var id: Int? = null
    var name: String? = null}

Я искал самый простой способ конвертировать старый тип в новый.Я хочу сделать просто

var user = User()
var userNew = user as UserNew

Но, очевидно, я получаю This cast can never succeed.Создание нового объекта UserNew и установка каждого параметра невозможны, если у меня есть объект User с большим количеством параметров.Есть предложения?

Ответы [ 6 ]

0 голосов
/ 22 марта 2019

Для достижения этой цели вы можете просто использовать Gson и избегать шаблонного кода:

var user = User(....)

val json = Gson().toJson(user)

val userNew:UserNew =Gson().fromJson(json, UserNew::class.java)
0 голосов
/ 22 октября 2018

вы должны следовать этой логике для этого случая.примечание: @Frank Neblung ответ я реализовал

fun main(args: Array<String>) {
val user = User()
user.id = 10
user.name = "test"
var userNew = user.toUserNew()
println(userNew.id) // output is 10
println(userNew.name)// output is test
 }


class User() 
{
var id: Int? = null
var name: String? = null

fun toUserNew(): UserNew {
    val userNew = UserNew()
    userNew.id = id
    userNew.name = name
    return userNew
  }
}

  class UserNew() {
  var id: Int? = null
  var name: String? = null
  }
0 голосов
/ 22 октября 2018

Для этого вы можете использовать концепцию наследования:

https://www.programiz.com/kotlin-programming/inheritance

Пример:

open class Person(age: Int) {
// code for eating, talking, walking
}

class MathTeacher(age: Int): Person(age) {
// other features of math teacher
}
0 голосов
/ 22 октября 2018

as - оператор приведения Котлина.Но User это не UserNew.Поэтому приведение не выполняется.

Используйте функцию расширения для преобразования между типами:

fun User.toUserNew(): UserNew {
    val userNew = UserNew()
    userNew.id = id
    userNew.name = name
    return userNew
}

И используйте это так

fun usingScenario(user: User) {
    val userNew = user.toUserNew()
0 голосов
/ 22 октября 2018

У вас есть два варианта.Либо создайте интерфейс и реализуйте его в обоих классах.тогда вы можете использовать этот интерфейс в обоих местах (User, UserNew). Если это не то, что вам нужно, я бы использовал конструктор копирования в UserNew, принимая User в качестве параметра. Вы можете создать новый

NewUser nu = new UserNew(userOld)

если у вас много свойств, ответ от ppressives - это путь

0 голосов
/ 22 октября 2018

Если вы не хотите писать шаблонный код, вы можете использовать некоторые библиотеки, которые будут копировать значения с помощью отражения (например, http://mapstruct.org/),, но это не лучшая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...