scala列表与泛型的模式匹配

scala列表与泛型的模式匹配,scala,generics,pattern-matching,Scala,Generics,Pattern Matching,我有一节课 case class MyClass[T](values: List[T]) 我试图创建一个函数,它将根据T的类型返回一个值 def myFunc: T = values match { case v: List[Boolean] => false case v: List[MyType] => MyType.defaultVal case _ => throw new Exception("unsupported type") }

我有一节课

case class MyClass[T](values: List[T])
我试图创建一个函数,它将根据T的类型返回一个值

def myFunc: T = values match {
  case v: List[Boolean] => false
  case v: List[MyType] => MyType.defaultVal
  case _ => throw new Exception("unsupported type")
}
但是,我遇到编译错误:

布尔类型的表达式不符合预期的类型t

MyType.defaultVal.type类型的表达式不符合预期的类型t


我想我可以通过创建一个抽象类ans子类来解决这个问题,但我不想这样做。有没有别的办法解决这个问题?

我想你可以用scala解决这个问题,但我不是这个领域的专家,总是觉得这个问题太复杂了

我喜欢使用的一个更简单的解决方案是在头部元素上进行模式匹配:

def myFunc: T = values.headOption.map {
  case v: Boolean => false
  case v: MyType => MyType.defaultVal
  case _ => throw new Exception("unsupported type")
}.getOrElse(throw new Exception("unsupported type"))

问题是模式匹配主要在运行时执行,类型在编译时解析。由于类型擦除
case v:List[Boolean]=>?
并不优于
case v:List[\u]=>?
。在
case v:List[Boolean]=>…
行中,编译器不知道
t=:=Boolean
。模式匹配不能从不同的情况返回不同的类型

因此,您可以选择使用类型标记匹配模式和强制转换模式

case class MyClass[T](values: List[T]) {   
  import reflect.runtime.universe.{TypeTag, typeOf}
  def myFunc(implicit typeTag: TypeTag[T]): T = values match {
    case v: List[Boolean] if typeOf[T] <:< typeOf[Boolean] => false.asInstanceOf[T]
    case v: List[MyType]  if typeOf[T] <:< typeOf[MyType]  => MyType.defaultVal.asInstanceOf[T]
    case _ => throw new Exception("unsupported type")
  } 
}
case class MyClass[T](values: List[T]) {
  def myFunc(implicit myFuncInstance: MyFunc[T]): T = myFuncInstance(values)
}

trait MyFunc[T] {
  def apply(values: List[T]): T
}
object MyFunc {
  implicit val booleanMyFunc: MyFunc[Boolean] = new MyFunc[Boolean] {
    override def apply(values: List[Boolean]): Boolean = false
  }

  implicit val myTypeMyFunc: MyFunc[MyType] = new MyFunc[MyType] {
    override def apply(values: List[MyType]): MyType = MyType.defaultVal
  }
}