Я пытаюсь создать систему нумерации как для целых чисел без знака, так и для целых чисел. Оба этих типа имеют значение underlying
, которое представляет число в системе с номером Scala. Вот иерархия типов, которую я имею до сих пор.
sealed trait Number {
def + (num : Number) : Number = ???
def - (num : Number) : Number = ???
def * (num : Number) : Number = ???
}
sealed trait SignedNumber extends Number
sealed trait UnsignedNumber extends Number
sealed trait UInt32 extends UnsignedNumber {
def underlying : Long
}
sealed trait UInt64 extends UnsignedNumber {
def underlying : BigInt
}
sealed trait Int32 extends SignedNumber {
def underlying : Int
}
sealed trait Int64 extends SignedNumber {
def underlying : Long
}
Я хотел бы определить underlying
в признаке Number
, чтобы компилятор мог обеспечить, чтобы underlying
определялся во всех дочерних элементах. Однако типы для underlying
изменяются для каждого признака - я хочу сохранить наименьший возможный тип для каждого типа. Например, UInt32
можно сохранить как long
в Scala, а UInt64
необходимо сохранить как BigInt
.
Каков наиболее эффективный способ сделать это?