我在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编译器中的错误吗?