【发布时间】:2018-08-09 12:05:28
【问题描述】:
Scala 有一个很好的特性来推断模式匹配中的类型参数。它还检查模式匹配的详尽性。例如:
sealed trait PField[T]
case object PField1 extends PField[String]
case object PField2 extends PField[Int]
def getValue[X](f: PField[X]): X = f match {
case PField1 => "aaa"
case PField2 => 123
}
是否可以实现相同但使用类型成员而不是类型参数?
sealed trait Field {
type T
}
case object Field1 extends Field {
type T = String
}
case object Field2 extends Field {
type T = Int
}
以下解决方案不起作用(在 Scala 2.12.6 中测试):
//No exhaustiveness check
def getValue[X](f: Field {type T = X}): X = f match {
case Field1 => "aaa"
// case Field2 => 123
}
//casting needed
def getValue2[X](f: Field {type T = X}): X = (f: Field) match {
case Field1 => "aaa".asInstanceOf[X]
case Field2 => 123.asInstanceOf[X]
}
type Generified[X] = Field {type T = X}
//No exhaustiveness check
def getValue3[X](f: Generified[X]): X = f match {
case Field1 => "aaa"
// case Field2 => 123
}
在我的情况下,类型参数确实有问题,因为我有许多字段的子层次结构,并且每个层次结构都有一些类型类。我不能将所有需要的依赖项放在 case 对象中,因为它们是在一个瘦 JAR 中导出给客户端的。
【问题讨论】:
标签: scala generics types pattern-matching type-members