通用ADT和抽象类型上的模式匹配无法编译

时间:2018-06-26 16:16:41

标签: scala pattern-matching algebraic-data-types abstract-type

我在scala中发现了一些我无法完全解释的奇怪信息。 我有一个广义的代数数据类型(DbType)和一个特征值为FieldAdapter的特征,该特征具有一个抽象类型U和一个成员dbType类型为DbType[U]。 由于某些晦涩的原因,我无法在成员dbType上进行模式匹配,因为编译器给出以下错误: Pattern type incompatible, found StringDbType.type required DbType[x.U]

sealed trait DbType[T]
case object StringDbType extends DbType[String]
case object IntDbType extends DbType[Int]

trait FieldAdapter {
  type U
  def dbType: DbType[U]
}

class ExampleTest {
  "Pattern matching" should "work for a generalised ADT" in {
    val x: FieldAdapter = new FieldAdapter {
      override type U = String
      override def dbType: DbType[String] = StringDbType
    }

    val dbTypeName = x.dbType match {
      case StringDbType => "varchar"
      case IntDbType => "integer"
    }
  }
}

我发现这可以解决问题:

val dbTypeName = (x.dbType: DbType[_]) match {
  case StringDbType => "varchar"
  case IntDbType => "integer"
}

这是Scala编译器中的错误吗?

0 个答案:

没有答案