Scala 编写自己的包装器类,允许int、float和string
启动时,我正在读取一个.xml文件,并希望在运行时将数据存储在一个对象中 问题是,我不想手动指定每个字段,而是使用映射来存储不同的值 但是,我不希望使用“String”或类似“Node”之类的.xml类,而是希望我的映射类型为: 映射[StringKey,Wrapper],其中Wrapper可以容纳Int、Float或字符串 现在大概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:
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
?您的最后一个问题完全正确。。。考虑到这一点,我可能也应该将每个值存储为字符串,并根据需要转换它,因为我事先没有信息,所以自动转换不会真正有帮助。