Scala 编写自己的包装器类,允许int、float和string

Scala 编写自己的包装器类,允许int、float和string,scala,types,wrapper,Scala,Types,Wrapper,启动时,我正在读取一个.xml文件,并希望在运行时将数据存储在一个对象中 问题是,我不想手动指定每个字段,而是使用映射来存储不同的值 但是,我不希望使用“String”或类似“Node”之类的.xml类,而是希望我的映射类型为: 映射[StringKey,Wrapper],其中Wrapper可以容纳Int、Float或字符串 现在大概 class Wrapper(val: AnyVal) { def this(val: String) = this(val) def this(val:

启动时,我正在读取一个.xml文件,并希望在运行时将数据存储在一个对象中

问题是,我不想手动指定每个字段,而是使用映射来存储不同的值

但是,我不希望使用“String”或类似“Node”之类的.xml类,而是希望我的映射类型为:

映射[StringKey,Wrapper],其中Wrapper可以容纳Int、Float或字符串

现在大概

class Wrapper(val: AnyVal)
{
  def this(val: String) = this(val)
  def this(val: Int) = this(val)
  def this(val: Float) = this(val)
}
这不是我真正想要的。我想100%确定它是字符串、Int或Float

我可以编写一个空的构造函数和setter方法,但这很难看

另一个选择是将所有内容强制转换为字符串->而不是我想要的内容

每当我从映射中检索/获取值时,我都希望它手动转换为其类型。比如如果它是一个Int,比如:

val size = cache.get("size").actualType
应该自动为Int(即,如果带有键“size”的包装器包含Int)

是否有任何东西可以使用,或者我是否可以巧妙地使用枚举来完成任务


也许有更好的解决方案,比如一些我不习惯的FP概念(尽管这似乎是OOP的领域)

问题是Scala是静态类型的,尽管它有很多有用的类型推断。它需要在编译时设置
val size
的类型

在以下可能的解决方案中,
val values
的类型是
List[Any]
,因为
Any
case
子句中所有可能返回类型的公共父级:

trait Wrapper

case class IntWrapper(value: Int) extends Wrapper

case class StringWrapper(value: String) extends Wrapper

case class DoubleWrapper(value: Double) extends Wrapper

val wrappers = List(
  IntWrapper(1),
  StringWrapper("1"),
  DoubleWrapper(1.0d)
)

val values = wrappers.map{
  case IntWrapper(v) => v
  case StringWrapper(v) => v
  case DoubleWrapper(v) => v
}

在您的代码上下文中,如果您不知道变量的类型,您打算如何处理变量
size

您的最后一个问题完全正确。。。考虑到这一点,我可能也应该将每个值存储为字符串,并根据需要转换它,因为我事先没有信息,所以自动转换不会真正有帮助。