有没有什么方法可以在Scala列表中保存类型?

时间:2017-03-10 17:01:48

标签: scala

我尝试使用名为 Request.destroy_all FilterList创建类似 Enumeration 的内容。

FilterType应该有一个FilterList元组列表,例如

(filterValue, ClassOfValue, FilterType)

这样做的主要原因是从以下内容中读取过滤器并将该过滤器写入JSON:

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

问题是我没有找到替换(__ \ filterName).read[ClassOfValue] 的方法,我甚至不知道Scala中是否可以。

修改

Intellij IDEA 建议我将其指定为???,但感觉不应该有Object引用:

Class

1 个答案:

答案 0 :(得分:3)

除了为每种类型的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]的内容。