如何在Scala中实例化结构类型?

时间:2019-05-07 10:10:38

标签: scala duck-typing structural-typing

我正在尝试在Scala中创建结构类型,以避免定义中间类。本质上,我只想定义一个将在JSON字符串中编组/解组的结构。

例如,描述以下JSON

{
    "query": {
        "range" : {
            "number" : {
                "gte": 123, 
                "lte": 456
            }
        }
    }
}

我有一个对应的结构类型:

  //structural
  type NumberRange = {val range: {val number: {val gte: Long; val lte: Long}}}

  //named
  case class NumberRangeQuery(query: NumberRange)

  //instance
  val nrq: NumberRangeQuery = ???

创建NumberRangeQuery实例的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

在这种情况下,答案不是使用结构类型,而是花更多的精力来使用案例类,并使代码更具可读性和效率:

case class Number(gte: Long, lte: Long)
case class Range(number: Number)
case class Query(range: Range)
case class NumberRangeQuery(query: Query)

val nrq: NumberRangeQuery = NumberRangeQuery(
  Query(
    Range(
      Number(1, 3)
    )
  )
)

在这种情况下,为什么要选择结构类型而不是混凝土类型?

答案 1 :(得分:-2)

要创建实现结构类型的类的内联实例,可以使用以下方法:

//instance
  val nrq: NumberRangeQuery = NumberRangeQuery(new {
    val range = new {
      val number = new {
        val gte = 1: Long 
        val lte = 3: Long
      }
    }
  })

请注意,实例化“匿名”结构类型至少要受到2种惩罚:

1)它可以说是可读的代码
2)Scala将在运行时使用反射在此类实例上调度方法(discussion here