scala - scala 中泛型抽象类型的模式匹配

标签 scala generics types type-erasure scala-generics

我有一个自递归类型:

trait Problem[P <: Problem[P]] {
  type Solution
}

现在,我想在 P#Solution 上进行模式匹配。假设我们在case class Foo[P <: Problem[P]]()内:

case ExampleCaseClass(s: P#Solution) if conditionApplies() =>
  // do sth

case ExampleCaseClass(s: P#Solution) =>
  // now sth else

当然,由于类型删除而失败。有什么方法可以让该代码在 scala 中编译吗?

我见过类/类型标签,但我不太确定它们是否可以在这种情况下使用。

最佳答案

您确实可以使用类型标签,但是您需要一个具体类型来从中获取类型标签。您可以将解决方案类型添加为类型参数:

case class Foo[P <: Problem[P], S <: P#Solution:TypeTag]() {
  def doSomething[T:TypeTag](c: ExampleCaseClass[T]) = c match {
    case ExampleCaseClass(s) if typeOf[T] =:= typeOf[S] => "x"
    case ExampleCaseClass(s) => "y"
  }
}

如果您想要子类型匹配,请使用 <:<而不是=:= .

关于scala - scala 中泛型抽象类型的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37124617/

相关文章:

scala - Scala 中 Map.get 的处理选项

java - 如何定义通用排序类

c++ - 多态性中的通用 STL 迭代器

types - Prolog中有哪些数据类型?

c# - Func<someType,someType =""> - 等号是什么意思?

java - 如何确定java中构造函数中变量的类型?

scala - list 和抽象类型解析

scala - Apache Spark : how to cancel job in code and kill running tasks?

scala - 将匹配案例应用于 Spark 列?

java - 如何使用 IntelliJ 伪造 C++ 风格的 "auto"类型推导?