2012-08-16 114 views
0

可能重複:
How do I get around type erasure on Scala? Or, why can't I get the type parameter of my collections?斯卡拉式擦除?

我跑到下面的代碼:

scala> var s = new Stack()push(1) 
s: scalatest.Stack[Int] = 1 

scala> s match { case s : Stack[String] => print("Hello")} 
<console>:12: warning: non variable type-argument String in type pattern scalatest.Stack[String] is unchecked since it is eliminated by erasure 
       s match { case s : Stack[String] => print("Hello") 
} 

棧是從http://www.scala-lang.org/node/129採取的類。如果我運行此代碼而沒有-unchecked標誌,它將打印「你好」。爲什麼會這樣?

+0

編譯器告訴你存在問題,它是什麼。你爲什麼在這裏問這個問題? – 2012-08-16 16:44:09

回答

2

問題是您匹配的s的類型爲Stack[String]。在運行時,它可能以確定是否sStack型的,但由於Java的type erasure這是不可能的,以確定是否sStack[String]類型,Stack[Int]等。所以不管是什麼類型的參數是,它就會被case表達式匹配。這就是Scala發佈警告的原因。它與你匹配的相同

s match { case s : Stack[_] => print("Hello")} 

(它將在沒有警告的情況下編譯)。


編輯:一種解決方法(對於Java太)是創建沒有類型參數的任何更具體的類。例如:

import scala.collection.mutable.Stack; 

object Test extends App { 
    class MyStack extends Stack[Int]; 
    class MyOtherStack extends Stack[String]; 

    val s: Stack[_] = new MyStack().push(1); 

    s match { 
    case s : MyOtherStack => print("Hello String"); 
    case s : MyStack => print("Hello Int"); 
    } 
} 

它,你不能用它來一成不變的容器,因爲他們的方法創建新的對象,他們將不會成爲這些我們的具體子類的實例缺點。

+0

啊,好的...所以泛型不是在Scala中實現的 – Bober02 2012-08-16 11:29:48