Scala match/case 多类型分支
Scala match/case multiple typed branch
我会尽量说清楚。
我有这个 class 结合了另外两个 classes HBaseCREvent 和 HBaseCR:
class HBaseCREvent(val rowKey : scala.Predef.String, val actualEnd : scala.Predef.String, val actualImpact : scala.Predef.String, val actualStart : scala.Predef.String)
class combinedType[T]
object combinedType {
implicit object HBaseCREventWitness extends combinedType[HBaseCREvent]
implicit object HBaseCRWitness extends combinedType[HBaseCR]
}
我有一个方法可以像这样实现
def convertHBaseObj[T:combinedType](event: T) : CRInput = {
event match {
case t @ (_: HBaseCREvent | _: HBaseCR) => {
this.setActualEnd(t.actualEnd)
this.setActualImpact(t.actualImpact)
this.setActualStart(t.actualStart)
}
}
}
当输入是 HBaseCREvent 或 HBaseCR 类型时,我试图避免重复同一组语句。
但是,这种方法不起作用。我的 IDE 无法解析属性(t.actualEnd、t.actualImpact 等)。
我也试过这个:
def convertHBaseObj[T:combinedType](event: T) : CRInput = {
event match {
case t: HBaseCREvent|HBaseCR => {
this.setActualEnd(t.actualEnd)
this.setActualImpact(t.actualImpact)
this.setActualStart(t.actualStart)
}
}
}
但是我得到一个错误:
illegal variable in pattern alternative
有什么帮助吗?
谢谢
如果您控制了 HBaseCREvent,HBaseCR 就会将您的方法提取到特征中并实现它。
trait MyTrait {
def actualEnd = ???
def actualImpact = ???
def actualEnd = ???
}
def convertHBaseObj(t: MyTrait) = {
setActualEnd(t.actualEnd)
setActualImpact(t.actualImpact)
setActualStart(t.actualStart)
}
如果您没有控制权,则可以执行以下操作。我在这里重新使用 CombinedEvent,因为你的版本没有做任何事情。
trait CombinedType[T] {
def actualEnd = ???
def actualImpact = ???
def actualEnd = ???
}
implicit def HBaseCREvent2CombinedType(t: HBaseCREvent) = new CombinedType[HBaseCREvent] {
def actualEnd = t.actualEnd
def actualImpact = t.actualImpact
def actualEnd = t.actualEnd
}
implicit def HBaseCR2CombinedType(t: HBaseCR) = new CombinedType[HBaseCR] {
def actualEnd = t.actualEnd
def actualImpact = t.actualImpact
def actualEnd = t.actualEnd
}
def convertHBaseObj[T](event: T)(implicit combinedEvent: CombinedEvent[T]) = {
setActualEnd(combinedEvent.actualEnd)
setActualImpact(combinedEvent.actualImpact)
setActualStart(combinedEvent.actualStart)
}
任何一种解决方案都比您的模式匹配实现更好,因为如果将错误的类型传递给 convertHBaseObj,它们将在编译时而不是在运行时失败
我会尽量说清楚。 我有这个 class 结合了另外两个 classes HBaseCREvent 和 HBaseCR:
class HBaseCREvent(val rowKey : scala.Predef.String, val actualEnd : scala.Predef.String, val actualImpact : scala.Predef.String, val actualStart : scala.Predef.String)
class combinedType[T]
object combinedType {
implicit object HBaseCREventWitness extends combinedType[HBaseCREvent]
implicit object HBaseCRWitness extends combinedType[HBaseCR]
}
我有一个方法可以像这样实现
def convertHBaseObj[T:combinedType](event: T) : CRInput = {
event match {
case t @ (_: HBaseCREvent | _: HBaseCR) => {
this.setActualEnd(t.actualEnd)
this.setActualImpact(t.actualImpact)
this.setActualStart(t.actualStart)
}
}
}
当输入是 HBaseCREvent 或 HBaseCR 类型时,我试图避免重复同一组语句。 但是,这种方法不起作用。我的 IDE 无法解析属性(t.actualEnd、t.actualImpact 等)。
我也试过这个:
def convertHBaseObj[T:combinedType](event: T) : CRInput = {
event match {
case t: HBaseCREvent|HBaseCR => {
this.setActualEnd(t.actualEnd)
this.setActualImpact(t.actualImpact)
this.setActualStart(t.actualStart)
}
}
}
但是我得到一个错误:
illegal variable in pattern alternative
有什么帮助吗?
谢谢
如果您控制了 HBaseCREvent,HBaseCR 就会将您的方法提取到特征中并实现它。
trait MyTrait {
def actualEnd = ???
def actualImpact = ???
def actualEnd = ???
}
def convertHBaseObj(t: MyTrait) = {
setActualEnd(t.actualEnd)
setActualImpact(t.actualImpact)
setActualStart(t.actualStart)
}
如果您没有控制权,则可以执行以下操作。我在这里重新使用 CombinedEvent,因为你的版本没有做任何事情。
trait CombinedType[T] {
def actualEnd = ???
def actualImpact = ???
def actualEnd = ???
}
implicit def HBaseCREvent2CombinedType(t: HBaseCREvent) = new CombinedType[HBaseCREvent] {
def actualEnd = t.actualEnd
def actualImpact = t.actualImpact
def actualEnd = t.actualEnd
}
implicit def HBaseCR2CombinedType(t: HBaseCR) = new CombinedType[HBaseCR] {
def actualEnd = t.actualEnd
def actualImpact = t.actualImpact
def actualEnd = t.actualEnd
}
def convertHBaseObj[T](event: T)(implicit combinedEvent: CombinedEvent[T]) = {
setActualEnd(combinedEvent.actualEnd)
setActualImpact(combinedEvent.actualImpact)
setActualStart(combinedEvent.actualStart)
}
任何一种解决方案都比您的模式匹配实现更好,因为如果将错误的类型传递给 convertHBaseObj,它们将在编译时而不是在运行时失败