scala определяющий класс с дополнительным параметром для типа
Я использую класс case, который - среди других параметров - создается с шестнадцатеричным значением BigInt. Я использую этот класс для десериализации сообщений JSON через Джексона / Джексона. Прелесть использования Джексона в том, что де / сериализация работает "из коробки" для классов дел, основанных на их сигнатуре (я полагаю).
Теперь значение BigInt в шестнадцатеричном кодировании необходимо создать с помощью дополнительного параметра radix: BigInt(hexValue, 16). Однако мои сообщения JSON не содержат такого параметра. Я ищу решение, чтобы определить это основание в определении класса моего дела, чтобы Джексон мог продолжать использовать класс без конфигурации. Что-то вроде:
case class MyClass(name: String, hexValue: BigInt(hexValue, 16))
Я понимаю, что альтернативные подходы заключаются в том, чтобы а) явно определить де-сериализацию JSON или б) определить мой собственный класс-оболочку вокруг BigInt. Однако я ищу более элегантное и "скалашское" решение - если оно есть.
Примечание: Int недостаточно, оно должно быть BigInt.
2 ответа
Вы можете переопределить apply
способ настройки case class
конкретизация..
case class MyClass (name: String, hexValue: BigInt)
object MyClass{
def apply(name: String, hexValue: String) =
new MyClass(name,BigInt(hexValue,16))
}
Используйте это как
MyClass("Foo","29ABCDEF") //> res0: MyClass = MyClass(Foo,699125231)
Я думаю, что вам лучше всего идти с оберткой на BigInt
, Что-то вроде
import java.math.BigInteger
class BigHexInt(hexString: String)
extends BigInt(new BigInteger(hexString, 16))
Тогда напишите свой case class
с помощью BigHexInt
:
case class MyClass(name: String, bigHex: BigHextInt)