Согласно спецификации 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
, а не в случае textractor case-class. Есть ли у вас какие-либо идеи о причине предупреждения / о том, что я должен сделать, чтобы избежать этого предупреждения?
Примечание. Если вы хотите протестировать его в REPL, самый простой способ:
Чтобы активировать непроверенное предупреждение
скала> :сила
scala> settings.unchecked.value = true
Чтобы скопировать приведенный выше код в режиме вставки:
скала> :вставить
[копировать вставить]
[Ctrl + D]
Редактировать: Как упомянул Анторас, это должна быть ошибка компилятора, возможно, версия scala может быть полезна: scala 2.9.0.1 (после быстрого теста, все еще в scala 2.9.1RC2)