【问题标题】:Write own Wrapper-class that allows Ints, Floats and Strings编写允许 Int、Floats 和 Strings 的自己的 Wrapper-class
【发布时间】:2015-09-07 07:29:56
【问题描述】:

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

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

但不是使用“String”或像“Node”这样的 .xml 类或类似的东西,我希望我的 Map 是类型:

Map[StringKey, Wrapper] 其中 Wrapper 可以保存 一个 Int、一个浮点数或一个字符串。

现在是这样的

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 方法,但这很丑。

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

每当我从 Map 中检索/获取值时,我都希望它手动转换为它的类型。就像那里的 Int 一样:

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

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

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

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

【问题讨论】:

    标签: scala types wrapper


    【解决方案1】:

    问题在于 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?

    【讨论】:

    • 您的最后一个问题是绝对正确的...想到,我可能应该将每个值也存储为 String 并根据需要进行转换,因为我事先没有信息自动转换不会不是很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 2020-10-23
    相关资源
    最近更新 更多