将几个枚举合并为一个

时间:2018-01-17 17:30:04

标签: scala

我们假设我们接下来有两个枚举

object EnumX extends Enumeration {
  val val1 = Value
  val val2 = Value
}

object EnumY extends Enumeration {
  val valA = Value
  val valB = Value
}

这些枚举具有相似的商业价值,无法更改。出于某种原因,我希望拥有&#34; new&#34; type (让我们将其命名为 MixedEnumXY ),它可以接受来自 EnumX EnumY 的枚举值:< / p>

E.g。

val e1: MixedEnumXY = EnumX.val1
val e2: MixedEnumXY = EnumY.valA

是否可以在Scala中实现此功能?

3 个答案:

答案 0 :(得分:1)

你想要的东西对我来说似乎很难得,所以你可能应该对依赖隐式转换的hacky解决方案感到满意:

object EnumX extends Enumeration {
  val val1 = Value
  val val2 = Value
}

object EnumY extends Enumeration {
  val valA = Value
  val valB = Value
}

import scala.languageFeature.implicitConversions

object MixedEnumXY extends Enumeration {
  val val1 = Value
  val val2 = Value
  val valA = Value
  val valB = Value

  implicit def fromEnumX(ex: EnumX.Value): MixedEnumXY.Value = ex match {
    case EnumX.val1 => val1
    case EnumX.val2 => val2
  }

  implicit def fromEnumY(ey: EnumY.Value): MixedEnumXY.Value = ey match {
    case EnumY.valA => valA
    case EnumY.valB => valB
  }
}

def test(): Unit = {
  val e1: MixedEnumXY.Value = EnumX.val1
  val e2: MixedEnumXY.Value = EnumY.valA
}

另一个显而易见的选择是使用Either或使用您的附加逻辑创建类似的自定义类。

答案 1 :(得分:1)

也许你可以使用密封的案例类?

var ref = firebase.database().ref("posts");
ref.orderByChild("subscribers/"+subcriberId).on("child_added", function(snapshot) {

});

答案 2 :(得分:1)

所以,我提出了下一个DRAFT解决方案

object EnumX extends Enumeration {
  val val1 = Value
  val val2 = Value
}

object EnumY extends Enumeration {
  val valA = Value
  val valB = Value
}

sealed trait MixedEnum {
  def reason: Enumeration#Value
  override def toString: String = reason.toString
}

case class EnumXMix(reason: EnumX.Value) extends MixedEnum
case class EnumYMix(reason: EnumY.Value) extends MixedEnum


object MixedEnum {
  implicit def EnumX2MixedEnum(value: EnumX.Value) = EnumXMix(value)
  implicit def EnumY2MixedEnum(value: EnumY.Value) = EnumYMix(value)
}

现在,您可以通过下一种方式使用它:

import MixedEnum._
val enumValue1: MixedEnum = EnumX.val1
val enumValue2: MixedEnum = EnumY.valA
val enumSeq: Seq[MixedEnum] = Seq(EnumX.val1, EnumY.valA)

println(enumValue1)
println(enumValue2) 
println(enumSeq)

输出:

val1
valA
List(val1, valA)