Разница между самодельным экстрактором и экстрактором классов case

Согласно спецификации 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 case, а не в случае textractor класса case. Есть ли у вас какие-либо представления о причине предупреждения / о том, что мне следует делать, чтобы избежать этого предупреждения?

Примечание: Если вы хотите протестировать его в REPL, самый простой способ:

  1. Активировать снятый флажок предупреждение

    scala>: power

    scala> settings.unchecked.value = true

  2. Чтобы скопировать приведенный выше код в режиме вставки:

    scala>: paste

    [копировать / вставить]

    [ctrl + D]

Изменить: Как сказал Анторас, это должна быть ошибка компилятора, возможно, версия scala может быть полезна: scala 2.9.0.1 (после быстрого тестирования, все еще присутствует в scala 2.9.1RC2)

6
задан Nicolas 11 August 2011 в 08:25
поделиться