编写自己的 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
?
启动时,我正在读取 .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
?