Как использовать экстрактор в полиморфном виде?

Я недействительно не понимаю эту маленькую штуку У меня есть абстрактный класс Box с несколькими подклассами для разных типов. Например

abstract class Box
class StringBox(val sValue : String) extends Box

Метод применения в сопутствующем объекте для Box прост:

object Box{
    def apply(s: String)  = new StringBox(s)
    def apply(b: Boolean) = new BooleanBox(b)
    def apply(d: Double)  = new DoubleBox(d)
}

так что я могу написать

    val sb = Box("StringBox)

Ладно, написание неприменяемых проблем. Моя первая идея состояла в том, чтобы использовать сопоставление с образцом для типа, вот так:}

def unapply(b: Box) = b match {
  case sb: StringBox => Some(sb.sValue)
  case bb: BooleanBox => Some(bb.bValue)
  case db: DoubleBox => Some(db.dValue)
  case _ => None

Который просто нет работает из-за стирания типа.

Второй попыткой был универсальный Box [T] с типом T и членом абстрактного типа, переопределенным в каждом подклассе. Например:

 abstract class Box[T] {def value : T}
 class StringBox(val sValue : String)  extends Box[String] { 
   override def value : String = sValue
 }

Следовательно, я могу переписать мою заявку как:

def unapply[T](b: Box[T]) = b match {
  case sb: Box[String]  => Some(sb.value)
  case bb: Box[Boolean] => Some(bb.value)
  case db: Box[Double]  => Some(db.value)
  case _ => None

К сожалению, это нетоже не работает. Поэтому я предполагаю, что явная ссылка на тип в Box [String] также удаляется, поэтому вместо этого мне нужно использовать манифест типа. Может быть что-то вроде:

def unapply[T](b: Box[_])(implicit target: Manifest[T]): Option[T] = {

   if(b.value ==  target) Some(b.value.asInstanceOf[T])
   else None 
}

Этот код компилирует (2.10), но все еще не делает желаемого неявного преобразования. Зачем?

Простой вопрос, есть ли способ сделать извлечение значения без использования отражения или манифеста?

Что меня действительно поражает, так это вопрос, существует ли простой (r) способ сочетания полиморфизма и сопоставления с образцом? Если нет, есть ли в Scala другие способы достижения подобного эффекта?

Любая идея или предложения?

Большое спасибо.

Ответы на вопрос(1)

Ваш ответ на вопрос