参数化类型元组的Scala匹配错误

时间:2015-10-29 01:33:36

标签: scala inheritance types

我正在尝试使用参数化基类为各种类型编写一些通用测试软件。我在代码上遇到匹配错误,我认为不应该这样。

abstract class AbstractTypeTest[TestType: ClassTag, DriverType <: AnyRef : ClassTag]( 
  def checkNormalRowConsistency(
    expectedKeys: Seq[TestType],
    results: Seq[(TestType, TestType, TestType)]) {

    val foundKeys = results.filter {
      case (pkey: TestType, ckey: TestType, data: TestType) => expectedKeys.contains(pkey)
      case x => throw new RuntimeException(s"${x.getClass}")
    }
    foundKeys should contain theSameElementsAs expectedKeys.map(x => (x, x, x))
  }
}

扩展类指定TypeTest的参数,但此代码块会抛出运行时异常(因为我们认为不应该匹配此处唯一允许的类型)

上面代码的输出有一些扩展类型可以使用,但有些则没有,在这种情况下我用TestType扩展这个类 - &gt; INT

[info]   java.lang.RuntimeException: class scala.Tuple3

我可以删除过滤器上的类型,并且ScalaTest检查工作正常,但我想了解MatchError发生的原因。

1 个答案:

答案 0 :(得分:1)

如果您使用的是Scala 2.10,那么

ClassTag based pattern matching fails for primitives

scala> import reflect._
import reflect._

scala> def f[A: ClassTag](as: Seq[(A,A,A)]) = as filter {
     | case (x: A, y: A, z: A) => true ; case _ => false }
f: [A](as: Seq[(A, A, A)])(implicit evidence$1: scala.reflect.ClassTag[A])Seq[(A, A, A)]

scala> val vs = List((1,2,3),(4,5,6))
vs: List[(Int, Int, Int)] = List((1,2,3), (4,5,6))

scala> f(vs)
res0: Seq[(Int, Int, Int)] = List()

与2.11

scala> f[Int](vs)
res4: Seq[(Int, Int, Int)] = List((1,2,3), (4,5,6))