启动时,我正在读取.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的领域)
答案 0 :(得分:2)
问题是Scala是静态类型的,即使它有很多有用的类型推断。它需要在编译时设置val size
的类型。
在以下可能的解决方案中,val values
的类型为List[Any]
,因为Any
是case
子句中所有可能返回类型的公共父级: / 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
做什么,因为您不知道它的类型?