我想了解什麼是斯卡拉與案例類,使他們以某種方式免疫鍵入擦除警告。斯卡拉:案例類不適用與手動執行和類型擦除
假設我們有以下簡單的類結構。這基本上是一個Either
:
abstract class BlackOrWhite[A, B]
case class Black[A,B](val left: A) extends BlackOrWhite[A,B]
case class White[A,B](val right: B) extends BlackOrWhite[A,B]
你正在嘗試使用這樣的:
object Main extends App {
def echo[A,B] (input: BlackOrWhite[A,B]) = input match {
case Black(left) => println("Black: " + left)
case White(right) => println("White: " + right)
}
echo(Black[String, Int]("String!"))
echo(White[String, Int](1234))
}
一切編譯並沒有任何問題運行。但是,當我嘗試自己實現unapply
方法時,編譯器會引發警告。我用下面的類結構用相同的Main
類以上:
abstract class BlackOrWhite[A, B]
case class Black[A,B](val left: A) extends BlackOrWhite[A,B]
object White {
def apply[A,B](right: B): White[A,B] = new White[A,B](right)
def unapply[B](value: White[_,B]): Option[B] = Some(value.right)
}
class White[A,B](val right: B) extends BlackOrWhite[A,B]
編譯,與-unchecked
標誌問題如下警告:
[info] Compiling 1 Scala source to target/scala-2.9.1.final/classes...
[warn] src/main/scala/Test.scala:41: non variable type-argument B in type pattern main.scala.White[_, B] is unchecked since it is eliminated by erasure
[warn] case White(right) => println("White: " + right)
[warn] ^
[warn] one warning found
[info] Running main.scala.Main
現在,我明白了類型擦除和我試着避免使用Manifests
(目前爲止無效)的警告,但這兩種實現有什麼區別?案例類是否需要添加一些東西?這可以用Manifests
繞過嗎?
我甚至試圖通過Scala編譯器與-Xprint:typer
標誌行駛的情況下類實現開啓,但unapply
方法看起來很像我的預期:提前
case <synthetic> def unapply[A >: Nothing <: Any, B >: Nothing <: Any](x$0: $iw.$iw.White[A,B]): Option[B] = if (x$0.==(null))
scala.this.None
else
scala.Some.apply[B](x$0.right);
感謝
你使用最新版本的Scala?我無法重現您的問題,並且幾個月前的這個相關問題確定了與您的類似問題,因爲它是編譯器錯誤。請參閱http://stackoverflow.com/questions/7008428/difference在自制的提取器和案例類提取器中 – Destin 2012-01-09 04:03:02
我使用的是2.9.1.final(在Xubuntu 11.10上,如果它很重要) – Nycto 2012-01-09 16:40:15