2017-03-10 8 views
1

私はFilterType呼ばEnumerationFilterListのようなものを作成しようとしていました。Scalaリストの中に型を保存する方法はありますか?

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参照があるべきようにそれは感じていない:作成するよりも

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

「Any」についてはどうですか? – sebszyller

+0

'Any'はコンパイルするべきであるが、クラスの指定子はありません。 'Any'を使用すると' '文字列 ''のような文字列値を追加することができます。その場合JSON呼び出しは機能しません –

+1

'ClassOfValue'のために別の列挙型を作成し、あなたが '(__ \ filterName).read [ClassOfValue]'をしたいときにその列挙型で? –

答えて

1

その他列挙型の値をClassOfValueとすると、タイプパラメータとしてClassOfValueをとるFilterクラスを作成することもできます。このフィルタクラスは、独自のJSON入出力を処理します。あなたは<LOOKUP FILTER VALUE>.read[A]、その後<FILTERED DATA>.write[A]のようなものを持っているだろうとapplyFilter方法でそう

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 
*/ 

:それは次のようになります。

+1

あなたのソリューションは本当に簡単で、私が必要としていたものでした。 –

関連する問題