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,它们将在编译时而不是在运行时失败