2016-12-05 11 views
2

私はScalaでSolrでリクエストするアプリケーションを作っています。 実際、私は要求後にインスタンス化する10のケースクラスを持っています。 一般的なアプリケーションを作成するには、パラメータ型を使用しようとします。Scala:パラメータの一致型

私の問題:私はParamter Typeにスイッチを入れなければなりません。それはobvが動作していない(消去のため)。

class mapSolr(docs){ 
    def toUseCase[T] = { 
     // Here i want to be able to make a switch on T 
     typeOf[T] match { 
     case x if x =:= typeOf[CaseClass1] => 
      blabla // (return List[CaseClass1] 
     case x if x =:= typeOf[CaseClass2] => 
      blabla // (return List[CaseClass2] 
     } 
} 

Iましたエラー "Tのために利用可能なTypeTag":

私リフレクションズ&擬似コード:

getItem[Apple](10) 

=>

ここ
def getItem[T](id : Option[Int]) = { 
... // Here I request Solr then i want to create my caseClass from Solr docs. 
mapsolr[T].toUseCase(docs) // send solr docs to map 
} 

私のマッピングを参照してください。 。私はその消去を知っているが、私はどのようにするか分からない。私はちょうど私のパラメータの型をテストすることができるようにしたい

...

感謝。

+1

私はあなたが探しているfelingを持っていますそのようなもの:http://docs.scala-lang.org/overviews/reflection/typetags-manifests.html – Pavel

+0

私はTypeTagを使用する必要があることを知っています。 Probem:私はそれをどのように使用して実装するのか分かりません。 – GreGGus

答えて

5

追加するTypeTag Tにバインドされたコンテキストを必要とする:

import scala.reflect.runtime.universe._ 

def toUseCase[T: TypeTag] = { 
    // Here i want to be able to make a switch on T 
    typeOf[T] match { 
    case x if x =:= typeOf[CaseClass1] => 
     blabla // (return List[CaseClass1] 
    case x if x =:= typeOf[CaseClass2] => 
     blabla // (return List[CaseClass2] 
    } 
} 

ます。また、この方法を使用して汎用コードでTypeTagに合格する必要があります。

def getItem[T: TypeTag](id : Option[Int]) = { 
    ... // Here I request Solr then i want to create my caseClass from Solr docs. 
    mapsolr[T].toUseCase(docs) // send solr docs to map 
} 
+0

Yep make senses。 しかし、TypeTagがinitになっていないのと同じように、この問題が発生しました。 タイプタグがありません。 > mapsolr [T] .toUseCase(docs)//マップにsolrドキュメントを送信してください。 – GreGGus

+0

Btw、適切なインポートを行うといいでしょう。 – ipoteka