编写自己的Wrapper类,允许Ints,Floats和Strings

时间:2015-09-07 07:29:57

标签: scala types wrapper

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

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

但是我没有使用“String”或类似“Node”之类的.xml类,而是喜欢我的Map类型:

Map [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%确定它是String,Int或Float。

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

另一个选择是将所有内容都转换为String - >不是我想要的。

每当我从Map中检索/获取值时,我都希望手动转换为其类型。就好像它是一个Int那样的东西,比如:

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

应自动为Int(即,如果包含“size”键的Wrapper持有Int)。

有什么可以使用的,或者我能以某种方式聪明地使用Enumeration来完成任务吗?

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

1 个答案:

答案 0 :(得分:2)

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

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

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做什么,因为您不知道它的类型?