2012-04-25 7 views
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") 

は今、私は何がBを拡張したよう一覧に発見し、その後printTを使用します。このような何か:ラインcase b @ B(_) => b.printT(2)

val list = List(C) 

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

私が得た:

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

私はクラスのTを使用するオブジェクトの上にTを関連付けることができれば、この問題が解決されるだろう。これを解決する方法はありますか?

答えて

4

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

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

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

3)list matchは意味をなさない:listListあるので、決してBすることができます。おそらくlist foreachを意味していましたが、これはリストの各要素に一致するでしょうか?

ここに、2を期待どおりに出力するコードの修正版があります。あなたはその部品を使用するつもりはない場合Bを抽出するにはポイントがありませんので、

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

val list = List(C()) 

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

また、b @ B(_)構文は、私には奇妙なビットを探します。代わりに、タイプを一致させることができます:

list foreach { 
    case b: B[Int] => b.printT(2) 
} 
+0

すべての問題を修正しました。私のコードを簡素化していた時、彼らの中には迷っていました。ありがとう:) –

関連する問題