我有一个包含多个案例类和对象的特征,例如:
trait Logic[A <: Logic[A]] {
case class And(l: Logic[A], l2: Logic[A]) extends Logic[A]
trait Atom extends Logic[A]
case object True extends Atom
case object False extends Atom
// ...
}
trait LTLLogic extends Logic[LTLLogic]
object LTLLogic extends Logic[LTLLogic]
现在我想要匹配Logic[A]
类型的公式。
class Matcher[A <: Logic[A]] {
def matchFormula(f: Logic[A]) = f match {
case a: Logic[A]#And => //do something
case Logic[A]#True => //<< not working
case Logic[A]#False => //<< not working
case _ => //other cases
}
}
问题是,与Logic[A]#And
的匹配工作正常,但我无法与True
和False
匹配。如果我与班级匹配,我可能会得到它的工作:
case a:Logic[A]#Atom if a.getClass == a.True.getClass => //do something
case a:Logic[A]#Atom if a.getClass == a.False.getClass => //do something
但我真的不喜欢这个解决方案。有没有其他方法可以使它工作?
看起来路径依赖类型不是正确的工具。
按照建议,将案例类/对象从trait
移到object Logic
并在逻辑协变中生成A
似乎正在起作用。
trait Logic[+A <: Logic[A]]
object Logic{
case class And[A <: Logic[A]](l: Logic[A], l2: Logic[A]) extends Logic[A]
trait Atom[A <: Logic[A]] extends Logic[A]
case object True extends Atom[Nothing]
case object False extends Atom[Nothing]
}