2016-10-25 21 views
1

私は次のモデルを持っている:非可変型引数

case class Questionnaire(List(Question[_]) 
case class Question[A](text: String, Answer[A]) 
case class Answer[A](value: A) 

私はダブル、(答えはString型にすることができ、その種類に応じて、アンケートへの回答のすべてを設定しようとしていますかLOCALDATE):

val questionnaire = getMockQuestionnaireWithoutAnswers() 
questionnaire.questions.map { 
    case x: Question[String] => //...default the answer.value to some random string 
    case x: Question[Double] => //...default the answer.value to some random double 
    case x: Question[LocalDate] => //...default the answer.value to some random date 
} 

しかし、私はエラーを取得しています:それは消去することにより除去されるので、タイプのパターンexamplenamespace.Question [文字列]で

非可変型の引数の文字列は未チェックです。

私はこのようなクラスにタイプのすべてをラップする必要はありません:

case class StringQuestion(question: Question[String]) 

このエラーを回避する最善の方法は何ですか?

答えて

5

タイプ消去では、一致式で指定されたパラメトリックタイプが削除されています。つまり、Question[String]Question[Int]の違いがrタイムアウト。

これを回避する1つの方法は、そのタイプの具体的な実装を提供することです.JVMはそれを「消去」できません。

私は過去にこの構成を使用しました。おそらく他の方法もありますが、これは十分単純です:

case class Answer[A](a:A) 
case class Question[A](text: String, answer: Answer[A]) 
case class Questionnaire(questions: List[Question[_]]) 

// concrete types 
trait StringQuestion extends Question[String] 
trait DoubleQuestion extends Question[Double] 
trait IntQuestion extends Question[Int] 

def resolve(questions: List[Question[_]]): List[String] = { 
    questions.map { 
    case x: StringQuestion => "Stringy" 
    case x: DoubleQuestion => "Doubly" 
    case x: IntQuestion => "Inty" 
    } 
} 
3

このアプローチを試してみてください:

questionnaire.questions.map { 
    case Question(text, Answer(d:Double)) => // 
    case Question(text, Answer(s:String)) => // 
    case Question(text, Answer(ld:LocalDate)) => // 
} 

ご質問(テキスト)のテキストと回答(D、SまたはLD)の値へのアクセスを持っている

また、変数のエイリアスを使用することができます。

questionnaire.questions.map { 
    case q @ Question(text, a @ Answer(d:Double)) => // 
    case q @ Question(text, a @ Answer(s:String)) => // 
    case q @ Question(text, a @ Answer(ld:LocalDate)) => // 
} 
関連する問題