Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

288
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!