gpt4 book ai didi

scala - 在Scala中使用通用案例类

转载 作者:行者123 更新时间:2023-12-03 20:09:16 25 4
gpt4 key购买 nike

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

让我们保存一下,我具有以下类层次结构来模拟“变量”类型,该类型将一组类型装箱并允许使用模式匹配将它们拆箱:

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


如果叶类是泛型的,则在代码中可能存在一些更方便的地方。就像是:

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

关于scala - 在Scala中使用通用案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18858164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com