在Scala中使用泛型case类

在Scala中使用泛型case类,scala,generics,case-class,Scala,Generics,Case Class,我想知道对Scala case类使用泛型是否可以节省一些样板代码 让我们保存我有下面的类层次结构来模拟一个“variant”类型,该类型将一组类型装箱,并允许使用模式匹配取消装箱: sealed abstract class Box; case class DoubleBox(v: Double) extends Box; case class StringBox(v: String) extends Box; case class BooleanBox(v: Boolean) extends

我想知道对Scala case类使用泛型是否可以节省一些样板代码

让我们保存我有下面的类层次结构来模拟一个“variant”类型,该类型将一组类型装箱,并允许使用模式匹配取消装箱:

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"
}
在代码中可能有一些地方,如果叶case类是泛型,那么处理它们会更方便。比如:

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"
}
但这并没有编译。据我所知,这种语法并不是真正有效的Scala语法

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

编辑:Vinicius回答了我的问题,但看看答案,我还有另一个问题。是否有可能以某种方式提示编译器,只有某些类型列表可以用于参数TypedBox?我希望这样做是为了确保编译器仍然可以对TypedBox的使用/匹配进行彻底检查。

试试看

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"
}

对于问题的第二部分,有两种方法限制允许的类型

第一种方法是对类型进行绑定,这将限制允许的类型,但不允许编译器执行有意义的完整性检查,因为类型几乎可以在任何地方或任何时间定义

第二种方法是将类型封装在密封的trait中,但实际上您是在为每个类型创建一个case类,因此您最好删除额外的封装层,只需创建
DoubleBox
StringBox
,等等