Skip to content

타입 일치에 대해 더 살펴보기

Jaejin Gim edited this page Aug 29, 2016 · 1 revision

Type Eraser

// 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 타입으로 부터 리스트 타입을 결정
Clone this wiki locally