编写自己的 Wrapper-class 允许整数、浮点数和字符串

Write own Wrapper-class that allows Ints, Floats and Strings

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

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

但不是使用 "String" 或 .xml-class 之类的 "Node" 或类似的东西,我希望我的 Map 类型为:

Map[StringKey, Wrapper] 其中 Wrapper 可以容纳 Int、Float 或 String。

现在像

class Wrapper(val: AnyVal)
{
  def this(val: String) = this(val)
  def this(val: Int) = this(val)
  def this(val: Float) = this(val)
}

不是我想要的。我想 100% 确定它是 String、Int 还是 Float。

我可以写一个空的构造函数和 setter 方法来代替,但这很丑。

另一种选择是将所有内容都转换为字符串 -> 不是我想要的。

每当我 retrieve/get 来自 Map 的值时,我希望它手动转换为其类型。就像那里是 Int 一样,比如:

val size = cache.get("size").actualType

应该自动成为一个 Int(也就是说,如果带有键 "size" 的 Wrapper 持有一个 Int)。

有什么可以使用的东西吗?或者我可以巧妙地使用 Enumeration 来完成任务吗?

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

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

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

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