我们假设我们接下来有两个枚举:
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中实现此功能?
答案 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)