0

問題に焦点を当てるためだけに、元のコードを単純化しました。

私はこのクラスのセットを持っています:

abstract class A(n: String){
   def name = n
}

abstract class B[T](n: String) extends A(n){
   def printT(t: T) = println(t)
}

object B{
   def unapply[T](b: B[T]) = Some(b.name)
}

case class C extends B[Int]("integer")

ここで、As のリストで B を拡張するものを発見し、printT を使用したいと考えています。このようなもの:

val list = List(C)

list match{
   case b @ B(_) => b.printT(2) 
}

私が得た行case b @ B(_) => b.printT(2)で:

found   : Int(2)
required: T where type T
case b @ B(_) => b.printT(2)
                              ^

クラスの T を使用したいオブジェクトに T を関連付けることができれば、おそらくこの問題は解決されるでしょう。これを解決する方法はありますか?

4

1 に答える 1

4

コードにはいくつか問題があります。

1) ケース クラスは、パラメーター リストを使用して宣言する必要があります。case class C()

2) をインスタンス化するCには、 を記述する必要がありますC()List(C)はですがList[C.type]List(C())あなたList[C]が望むものです。

3)ケースが:であるlist match場合は意味がありません。おそらく、リスト内の各要素に対してどちらが一致するかを意味していましたか?BlistListBlist foreach

これは、期待どおりに印刷されるコードの修正版です2

case class C() extends B[Int]("integer")

val list = List(C())

list foreach {
  case b @ B(_) => b.printT(2)
}

さらに、その部分を使用しない場合b @ B(_)は抽出しても意味がないため、構文は少し奇妙に見えます。B代わりに、タイプで一致させることができます:

list foreach {
  case b: B[Int] => b.printT(2)
}
于 2012-04-25T16:13:36.047 に答える