-
Notifications
You must be signed in to change notification settings - Fork 7
타입 일치에 대해 더 살펴보기
Jaejin Gim edited this page Aug 29, 2016
·
1 revision
// src/main/scala/progscala2/patternmatching/match-types.sc
for {
x <- Seq(List(5.5,5.6,5.7), List("a", "b"))
} yield (x match {
case seqd: Seq[Double] => ("seq double", seqd)
case seqs: Seq[String] => ("seq string", seqs)
case _ => ("unknown!", x)
})
- JVM Type Eraser : List와 같은 Generic Type의 인스턴스에 사용했던 타입 매개변수 정보가 들어있지 않다.
- 컴파일러는 실행시점에 List[Double], List[String]을 구분할 수 없으므로 seqs: Seq[String] 으로 도달할 수 없음을 경고한다.
// src/main/scala/progscala2/patternmatching/match-types2.sc
def doSeqMatch[T](seq: Seq[T]): String = seq match {
case Nil => "Nothing"
case head +: _ => head match {
case _ : Double => "Double"
case _ : String => "String"
case _ => "Unmatched seq element"
}
}
for {
x <- Seq(List(5.5,5.6,5.7), List("a", "b"), Nil, "a")
} yield {
x match {
case seq: Seq[_] => (s"seq ${doSeqMatch(seq)}", seq)
case _ => ("unknown!", x)
}
}
- case seq: Seq[_]를 통해 컬렉션을 먼저 일치시키고, head 타입으로 부터 리스트 타입을 결정