Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

293
Visualizações
Kotlin: genéricos de clase de datos que pueden aceptar uno de los 2 tipos para uno de los parámetros

Me gustaría lograr algo en lo que pudiera llamar a una clase de datos con un tipo Int o BigDecimal . Así por ejemplo:

 data class Money(val amount: Int, val currencyCode: CurrencyCode) { fun toSmallestUnit(): Int = when (this.currencyCode) { CurrencyCode.USD -> this.amount * 100 CurrencyCode.EUR -> this.amount * 100 } }

Aquí me gustaría poder enviar tanto Int como BigDecimal como una cantidad a la clase de datos Money , y luego tener una función toSmallestUnit diferente para cada tipo. ¿Cómo puedo lograr esto en Kotlin?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Una forma de hacerlo es así

 data class Money<T>(val amount: T, val currencyCode: CurrencyCode) { fun toSmallestUnit(): T = when(amount) { is Int -> { when (this.currencyCode) { CurrencyCode.USD -> (this.amount * 100) as T CurrencyCode.EUR -> (this.amount * 100) as T } } is BigInteger -> { when (this.currencyCode) { CurrencyCode.USD -> this.amount.multiply(BigInteger("100")) as T CurrencyCode.EUR -> this.amount.multiply(BigInteger("100")) as T } } else -> { amount } } }

toSmallestUnit devolverá el tipo de resultado correcto según el tipo. Pero como puede ver, permite crear Money de cualquier tipo.

over 4 years ago · Santiago Trujillo Relatório

0

Cada vez que usa esta clase en el código, el compilador tiene que saber qué amount de tipo es para que pueda hacer algo con ella. Si estuviéramos trabajando con sus propias clases, podría definir una interfaz que ambas implementaran, pero esto no es posible con Int/BigDecimal.

Por lo tanto, le propongo que diseñe su clase para que simplemente use BigDecimal como el tipo de amount y proporcione constructores y propiedades para permitirle convertir desde Int.

Este es solo un ejemplo. No estoy seguro de cómo tiene sentido convertir una moneda en BigDecimal a un número entero.

 data class Money(val amount: BigDecimal, val currencyCode: CurrencyCode) { constructor(amount: Int, currencyCode: CurrencyCode): this(amount.toBigDecimal(), currencyCode) val intAmount: Int get() = amount.toInt() fun toSmallestUnit(): Int = when (this.currencyCode) { CurrencyCode.USD -> intAmount * 100 CurrencyCode.EUR -> intAmount * 100 } }
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda