2012-10-06 138 views
3

有人可以解釋爲什麼這給出了擦除警告?斯卡拉的流刪除警告

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 
} 

回答

3

這兩個都是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 
+0

怎麼樣的第二個例子是,也有斯卡拉錯誤? – Heptic

+0

@Heptic:抱歉,我一定忽略了這一點。我編輯了我的答案。 – sschaef