Scala仕様によると、caseクラスによって構築されるエクストラクターは次のとおりです(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
}
次の警告があります:
<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)
D
警告はケースでのみ発生し、ケースクラスのテキストアクターのケースでは発生しないことに注意してください。警告の原因/この警告を回避するために私が何をすべきかについて何か考えがありますか?
注: REPLでテストする場合、最も簡単な方法は次のとおりです。
チェックされていない警告をアクティブにするには
scala>:power
scala> settings.unchecked.value = true
上記のコードを貼り付けモードでコピーするには:
scala>:paste
[コピーペースト]
[ctrl + D]
編集: Antorasが言ったように、それはコンパイラのバグであるはずです、多分scalaバージョンが役に立つかもしれません:scala 2.9.0.1(簡単なテストの後、まだscala 2.9.1RC2にあります)