【问题标题】:Is there any way that a type can be saved inside a Scala list?有什么方法可以将类型保存在 Scala 列表中?
【发布时间】:2017-08-01 02:54:18
【问题描述】:

我试图创建类似于 FilterList 的东西,而 Enumeration 称为 FilterType

FilterList 应该有一个(filterValue, ClassOfValue, FilterType) 元组的列表,例如

val listOfFilters: List[(String, ???, FilterType)] = List(
  ("fromDate", String, DateFilter),
  ("toDate", String, DateFilter),
  ("id", Long, IdFilter)
)

这样做的主要原因是读取该过滤器并将该过滤器写入 JSON,如下所示:

(__ \ filterName).read[ClassOfValue]

问题是我还没有找到替换 ??? 的方法,我什至不知道在 Scala 中是否可行。

编辑:

Intellij IDEA 建议我将其指定为 Object,但感觉不应该有 Class 参考:

val listOfFilters: List[(String, Object, FilterType)] = List(
  ("fromDate", String, DateFilter),
  ("toDate", String, DateFilter),
  ("id", Long, IdFilter)
)

【问题讨论】:

  • Any 怎么样。
  • Any 是一个可以接受的替代品,因为它应该可以编译,但是类中没有任何说明符吗?使用Any,您可以添加例如"a string" 之类的字符串值,在这种情况下,JSON 调用将不起作用
  • 当你想做(__ \ filterName).read[ClassOfValue] 时,为ClassOfValue 创建另一个枚举然后在该枚举上进行模式匹配不是有意义吗?
  • @evan058 这确实是个好主意。主要要求是只允许非常通用的类,例如 StringLongDoubleBoolean

标签: scala


【解决方案1】:

除了为ClassOfValue 的每种类型创建一个枚举值之外,您还可以创建一个Filter 类,它将ClassOfValue 作为类型参数。然后这个过滤器类将处理它自己的 JSON 输入/输出。它看起来像这样:

import scala.reflect.runtime.universe.{TypeTag, typeOf}

object FilterType extends Enumeration
{
    type FilterType = Value
    val DateFilter, IdFilter = Value
}

import FilterType._

case class Filter[A](filterValue: String, filterType: FilterType)(implicit tt: TypeTag[A])
{
    def myTypeParam: Unit = println(s"My Type Param is ${typeOf[A]}")

    def applyFilter(data: A): A = ???
}


val l: List[Filter[_]] = List(Filter[String]("fromDate", DateFilter), 
                         Filter[String]("toDate", DateFilter), Filter[Long]("id", IdFilter))

l.foreach(_.myTypeParam)

/*
    Output: 
    My Type Param is String
    My Type Param is String
    My Type Param is Long
*/

因此,在 applyFilter 方法中,您将拥有类似 <LOOKUP FILTER VALUE>.read[A]<FILTERED DATA>.write[A] 的内容。

【讨论】:

  • 您的解决方案非常直接,正是我所需要的。
猜你喜欢
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
相关资源
最近更新 更多