Diferencia entre extractor casero y extractor de clase de caso

e acuerdo con la especificación scala, el extractor creado por las clases de casos es el siguiente (especificación scala §5.3.2):

def unapply[tps](x: c[tps]) =
  if (x eq null) scala.None
  else scala.Some(x.xs11, ..., x.xs1k)

Por razones de implementación, quiero poder imitar el comportamiento de este extractor en una clase sin mayúsculas y minúsculas. Sin embargo, mi implementación no puede reproducir el mismo comportamiento.

Aquí hay un ejemplo de la diferencia que tengo:

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
}

Tengo la siguiente advertencia:

<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)

bserve que la advertencia se produce solo en laD case, no en el caso de textractor de clase de caso. ¿Tiene alguna idea sobre la causa de la advertencia / sobre lo que debo hacer para evitar esta advertencia?

Nota Si desea probarlo en REPL, la forma más fácil es:

Para activar la advertencia no verificada

scala>: poder

scala> settings.unchecked.value = true

Para copiar el código anterior en modo pegar:

scala>: pegar

[copiar pegar

[ctrl + D]

Editar Como Antoras mencionó que debería ser un error del compilador, tal vez la versión de scala podría ser útil: scala 2.9.0.1 (después de una prueba rápida, todavía existe en scala 2.9.1RC2)

Respuestas a la pregunta(1)

Su respuesta a la pregunta