Я пишу оценщик выражений на основе дерева, и я столкнулся с некоторыми проблемами при стирании типов.
Дерево выглядит как
sealed abstract class Node[+T]
case class Var[+T](name:String) extends Node[T]
/* SNIP */
Оценщик равен
def eval[T](node:Node[T], context:Map[String, Any]):Option[T] = node match {
case Var(name) => context.get(name) match {
case Some(value:T) => Some(value)
case _ => None
}
/* SNIP */
}
Код компилируется, но проверки типов на Var
узлах не работают.Итак, этот тест не пройден:
class ContextEvaluatorTest extends FunSuite with ShouldMatchers {
test("evaluation with type mismatch") {
ContextEvaluator.eval(Var[Int]("a"), Map("a" -> "not int")) should equal (None)
}
}
Сообщение об ошибке:
org.scalatest.TestFailedException: Some(not int) did not equal None
Ситуация выглядит как сценарий использования для манифестов, но я не смог их правильно добавить.