を作っ:違いは、Scalaの仕様によると、ケースクラスによって構築された抽出には、次の(Scalaの仕様§5.3.2)で抽出し、ケースクラスの抽出に
def unapply[tps](x: c[tps]) =
if (x eq null) scala.None
else scala.Some(x.xs11, ..., x.xs1k)
実装上の理由から、私がしたいですノンケースクラスでこのエクストラクタの動作を模倣することができます。 しかし、私の実装は同じ振る舞いを再現することができません。ここで
は私が持っている違いの例です:
trait A
sealed trait B[X <: A]{ val x: X }
case class C[X <: A](x: X) extends B[X]
class D[X <: A](val x: X) extends B[X]
object D {
def unapply[X <: A](d: D[X]): Option[X] =
if (d eq None) None
else Some(d.x)
}
def ext[X <: A](b: B[X]) = b match {
case C(x) => Some(x)
case D(x) => Some(x)
case _ => None
}
私は次の警告があります:警告のみD
場合、ない場合、クラスで発生し
<console>:37: warning: non variable type-argument X in type pattern D[X] is unchecked since it is eliminated by erasure
case D(x) => Some(x)
お知らせテキスタイルケース。 警告の原因について/私がこの警告を避けるために何をすべきかについて考えていますか?
注:あなたがREPLでそれをテストしたい場合はは、最も簡単な方法は次のとおりです。
は未チェックの警告を有効にするには
スカラ>:パワー
スカラ> settings.unchecked .value = true
上記のコードを貼り付けモードでコピーする:
スカラ>:Antorasが、それはコンパイラのバグ、多分Scalaのバージョンでなければなりません述べたように:
[コピー/貼り付け]
[CTRL + D]
編集を貼り付けscala 2.9.0.1 (クイックテスト後、まだscala 2.9.1RC2にあります)
と思いますか? – Nicolas
はい、十分だと思います。警告がありますが、コードは正常に動作します。さらに、生成されたコードも正常に動作し、同一です。 – sschaef