5

私は本当にこの小さなことを取得しません。さまざまなタイプのいくつかのサブクラスを持つ抽象クラス Box があります。例えば

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

Box のコンパニオン オブジェクトの apply メソッドは単純です。

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)

さて、 unapply と書くと、問題が発生します。私の最初のアイデアは、次のように型にパターン マッチングを使用することでした。

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

}

型の消去のために、これは単に機能しません。

2 番目の試みは、型 T と各サブクラスで再定義された抽象型メンバーを持つジェネリック Box[T] でした。例えば:

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

したがって、unapply を次のように書き直すことができます。

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) されますが、依然として目的の暗黙的な変換は行われません。なんで?

簡単な質問ですが、リフレクションやマニフェストを使用せずに値を抽出する方法はありますか?

ポリモーフィズムとパターン マッチングを組み合わせる簡単な方法があるかどうかという質問は、私を本当に困惑させます。そうでない場合、Scala で同様の効果を達成する他の方法はありますか?

アイデアや提案はありますか?

どうもありがとうございました。

4

1 に答える 1