讓我們假設我們有一個泛型類Container
:如何在Scala中對泛型進行模式匹配?
case class Container[+A](value: A)
然後我們要匹配模式與Double
一個Container
和Any
一個Container
:
val double = Container(3.3)
var container: Container[Any] = double
要做到這一點,我們通常會寫:
container match {
case c: Container[String] => println(c.value.toUpperCase)
case c: Container[Double] => println(math.sqrt(c.value))
case _ => println("_")
}
但是,編譯器給出了兩個警告,前兩種情況各有一種。例如,第一個警告說:「類型模式Container [String]中的非變量類型參數String未被選中,因爲它被擦除消除」。由於擦除,在運行時不可能區分不同類型的容器,並且第一次捕獲將匹配。因此,Container[Double]
類型的容器將與第一種情況相匹配,這會捕獲Container[String]
對象,因此toUpperCase
方法將在Double
上調用,並且將拋出java.lang.ClassCastException
。
如何匹配由特定類型參數化的Container
?
我已經在那裏添加了對同一個問題的答案:[link]( http://stackoverflow.com/questions/35181533/can-we-elegantly-match-an-erased-type-in-scala/35181934#35181934) – dth