Предупреждение о стирании Scala Stream

Может ли кто-нибудь объяснить, почему это дает предупреждение об удалении?

def optionStreamHead(x: Any) =
  x match {
    case head #:: _ => Some(head)
    case _ => None
  }

Дает:

warning: non variable type-argument A in type pattern scala.collection.immutable.Stream[A] is unchecked since it is eliminated by erasure
            case head #:: _ => Some(head)

Я понимаю, что могу написать этот случай if (x.isInstanceOf[Stream[_]]) ... и не получить предупреждение, но в моем случае я действительно хочу использовать сопоставление с образцом, и иметь целую кучу предупреждений, которые я не понимаю, кажется плохим

А вот не менее загадочный случай:

type IsStream = Stream[_]

("test": Any) match {
  case _: Stream[_] => 1 // no warning
  case _: IsStream => 2 // type erasure warning
  case _ => 3
}

person Heptic    schedule 06.10.2012    source источник


Ответы (1)


Обе ошибки версии 2.9 исправлены в версии 2.10. В версии 2.10 мы получаем новый механизм сопоставления с образцом (называемый virtpatmat для виртуального сопоставления с образцом):

scala> def optionStreamHead(x: Any) =
  x match {
    case head #:: _ => Some(head)
    case _ => None
  }
optionStreamHead: (x: Any)Option[Any]

scala> optionStreamHead(0 #:: Stream.empty)
res14: Option[Any] = Some(0)

scala> ("test": Any) match {
     |   case _: Stream[_] => 1 // no warning
     |   case _: IsStream => 2 // type erasure warning
     |   case _ => 3
     | }
<console>:11: warning: unreachable code
                case _: IsStream => 2 // type erasure warning
                                    ^
res0: Int = 3
person kiritsuku    schedule 06.10.2012
comment
А как насчет второго примера, это тоже ошибка scala? - person Heptic; 07.10.2012
comment
@Heptic: Извините, я, должно быть, проглядел это. Я отредактировал свой ответ. - person kiritsuku; 07.10.2012