Добро пожаловать на StackOverflow .
Во-первых, в качестве совета для будущих вопросов постарайтесь предоставить весь код (соответствующий) , который вы можете - например, вв этом случае было бы полезно определить ваши классы параллелизма.
Во-вторых, я считаю, что это задание, и, вероятно, вам не нужно заходить слишком далеко.
Как уже сказал Робин, это to
Параметр используется для определения целевого типа, но, поскольку это будет класс, он будет иметь значение, которое нежелательно.
Я полагаю, идея состоит в том, чтобы передать пустой класс и сделать что-то подобное, используя сопоставление с образцом .
class Bitcoin(override val amount: Int = 0) extends Concurrency(amount) {
override def convert(to: Concurrency): Concurrency = to match {
case _: Bitcoin => this // no need to transform
case _: Euro => new Euro((this.amount / 2).toInt)
case _: Dollar => new Dollar((this.amount / 3).toInt)
}
}
new Bitcoin(30).convert(to = new Dollar()) // res0: Concurrency: Dollar(10)
В-третьих, это более безопасное решение, которое, я надеюсь, вы найдете интересным и "забавным" (условно) - плохоШутка предназначена.
sealed abstract class Concurrency(val amount: Int) {
def name: String
/** Tansforms this concurrency value to a new target type. */
final def to[C <: Concurrency](implicit builder: Concurrency.Builder[C]): C =
builder.build(this)
}
object Concurrency {
/** Builder of target concurrencies. */
trait Builder[C <: Concurrency] {
def build(origin: Concurrency): C
}
}
final case class Bitcoin(override val amount: Int) extends Concurrency(amount) {
override final val name: String = "Bitcoin"
}
object Bitcoin {
import Concurrency.Builder
implicit val BitcoinBuilder: Builder[Bitcoin] = new Builder[Bitcoin] {
override def build(origin: Concurrency): Bitcoin = origin match {
case b: Bitcoin => b // no need to transform
case Euro(amount) => Bitcoin(amount * 2)
case Dollar(amount) => Bitcoin(amount * 3)
}
}
}
final case class Euro(override val amount: Int) extends Concurrency(amount) {
override final val name: String = "Euro"
}
object Euro {
import Concurrency.Builder
implicit val EuroBuilder: Builder[Euro] = new Builder[Euro] {
override def build(origin: Concurrency): Euro = origin match {
case e: Euro => e // no need to transform
case Bitcoin(amount) => Euro((amount / 2).toInt)
case Dollar(amount) => Euro((amount / 1.5).toInt)
}
}
}
final case class Dollar(override val amount: Int) extends Concurrency(amount) {
override final val name: String = "Dollar"
}
object Dollar {
import Concurrency.Builder
implicit val DollarBuilder: Builder[Dollar] = new Builder[Dollar] {
override def build(origin: Concurrency): Dollar = origin match {
case d: Dollar => d // no need to transform
case Euro(amount) => Dollar((amount * 1.5).toInt)
case Bitcoin(amount) => Dollar((amount / 3).toInt)
}
}
}
Dollar(10).to[Bitcoin] // res0: Bitcoin = Bitcoin(30)
Не сомневайтесь, попросите разъяснений.