Вы можете использовать экзистенциальные типы для сопоставления с типом со стертыми параметрами:
type AnyNonEmpty = QNonEmpty[X] forSome { type X }
in match {
case x: AnyNonEmpty => //...
}
Экстрактор может выглядеть так:
object QNonEmpty {
def unapply(in: QNonEmpty[_]): Option[Any] = Some(in.foo)
}
def test[ V ]( n: Q[ V ]) : String = n match {
case QEmpty => "empty"
case QNonEmpty(foo) => foo.toString
}
Я не думаю, что вы можетеНапишите безопасное извлечение типов, так как в вашем примере кода параметр типа для метода также удаляется.Может быть, вам стоит подумать о добавлении метода fold
к вашей характеристике и переписать ваш пример так:
sealed trait Q[ +V ] {
def fold[A](e: => A, f: V => A): A = e
}
case object QEmpty extends Q[ Nothing ]
sealed trait QNonEmpty[ V ] extends Q[ V ] {
def foo: V
override def fold[A](e: => A, f: V => A) = f(foo)
}
// ...
def test[V](n: Q[V]) = n.fold("empty", _.toString)