Как насчет написания параметрического класса типа Union с неявными преобразователями из A => B и B => A
class Union [A, B] {
getA = ...
getB = ...
}
, который работал бы, если бы каждый B мог быть сохранен в A, например. Иначе, промежуточный, 3-й тип может быть использован для хранения и восстановления значений типов A и B, назовем его C.
class Union [A, B, C] (c: C) (implicit
a2c: (A => C),
b2c: (B => C),
c2a: (C => A),
c2b: (C => B)) {
def getA : A = c2a (c)
def getB : B = c2b (c)
}
As и B сохраняются как Cs, и есть метод, для A и один для B, чтобы снова получить значение из C.
Чтобы использовать его, мы используем несколько демо-методов:
def l2i (l: List[Char]): Int =
(0 /: l.reverse.take (4).reverse) ((a, b) => (a * 255 + b))
def i2l (i: Int): List[Char] =
if (i < 255) List (i.toChar) else (i % 255).toChar :: toChars (i / 255)
def l2s (l: List[Char]): String =
l.mkString ("")
def s2l (s: String): List[Char] =
s.toCharArray.toList
и затем мы создаем настоящий союз (String / Int / List):
class UnionSIL (l: List[Char])
extends Union [String, Int, List[Char]]
(l: List[Char]) (s2l, i2l, l2s, l2i) {
def this (i: Int) = this (i2l (i))
def this (s: String) = this (s2l (s))
}
и протестируйте его:
val ui = new UnionSIL (44)
val us = new UnionSIL ("foobar")
List(ui, us).foreach (u => println (u.getA + ": " + u.getB))
,: 44
foobar: 1846929924