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)
Другие вопросы по тегам