在Scala中使用通用案例类

Ale*_*rov 15 generics scala case-class

我想知道在Scala案例类中使用泛型是否可以节省一些样板代码.

让我们保存我有以下类hieararchy来模拟一个"变体"类型,它包含一组类型并允许使用模式匹配拆箱:

sealed abstract class Box;

case class DoubleBox(v: Double) extends Box;
case class StringBox(v: String) extends Box;
case class BooleanBox(v: Boolean) extends Box;

def typeName(b: Box) = b match {
  case DoubleBox(v) => "Double"
  case StringBox(v) => "String"
  case BooleanBox(v) => "Boolean"
  case _ => "Unknown"
}
Run Code Online (Sandbox Code Playgroud)

代码中可能存在一些地方,如果它们是泛型,那么处理叶子类更方便.就像是:

sealed abstract class Box;

case class TypedBox[T](v: T) extends Box;

def typeName2(b: Box) = b match {
  case TypedBox[Double](v) => "Double"
  case TypedBox[String](v) => "String"
  case TypedBox[Boolean](v) => "Boolean"
  case _ => "Unknown"
}
Run Code Online (Sandbox Code Playgroud)

但这不编译.据我所知,这种语法并没有真正被认为是有效的Scala语法.

有可能做出我想要的工作,或者这是一个坏主意,我只是没有得到什么?

编辑: Vinicius回答了我的问题,但看着答案,我有另一个问题.是否有可能以某种方式提示编译器只有某些类型的列表可用于参数TypedBox?我想要确保编译器仍然可以对TypedBox使用/匹配进行详尽的检查.

Vin*_*ana 25

尝试

sealed abstract class Box;

case class TypedBox[T](v: T) extends Box;

def typeName2(b: Box) = b match {
  case TypedBox(v: Double) => "Double"
  case TypedBox(v: String) => "String"
  case TypedBox(v: Boolean) => "Boolean"
  case _ => "Unknown"
}
Run Code Online (Sandbox Code Playgroud)